Java 状态机详解 —— 用状态模式优雅消灭 if-else 嵌套
在日常 Java 开发中,我们常常遇到这样的情况:不同的状态有不同的处理逻辑,状态之间会相互切换,不同状态下执行的动作可能完全不同。这时,如果我们用 if-else 或 switch-case 来写,代码很容易变得臃肿难维护。
比如处理订单状态时,常见的写法是这样的:
if(status == 0) { // 待支付逻辑
// ...
} else if(status == 1) { // 已支付逻辑
// ...
} else if(status == 2) { // 已发货逻辑
// ...
}
这种写法的问题:
- 逻辑分支多,扩展性差
- 新增状态时,需要修改原有代码(违反开闭原则)
- 状态切换逻辑容易分散在各个
if-else中,不够集中
使用状态机(State Machine),也就是状态模式,就可以解决上述这些问题,并具备以下优点:
- 消除复杂的条件判断语句
- 提高代码可读性和可维护性
- 使状态转换逻辑更加清晰
- 符合开闭原则,易于扩展新状态
1. 复现传统 if-else 实现的业务场景问题
假设有一个电商订单系统,订单状态有:待支付、已支付、已发货、已完成。订单流程是从待支付 → 支付 → 发货 → 完成,或者在待支付状态下取消订单。
那么可能你的代码就是像这样的:
public class OrderServiceIfElse {
public void handle(int status, String action) {
if (status == 0) {
if ("pay".equals(action)) {
System.out.println("订单已支付");
} else if ("cancel".equals(action)) {
System.out.println("订单已取消");
}
} (status == ) {
(.equals(action)) {
System.out.println();
}
} (status == ) {
(.equals(action)) {
System.out.println();
}
}
}
}


