在日常 Java 开发中,我们常常遇到这样的场景:不同的业务状态对应不同的处理逻辑,且状态之间会相互切换。如果直接使用 if-else 或 switch-case 来编写,代码很容易变得臃肿难维护。
为什么使用状态模式消除 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("订单已取消");
}
} else if (status == 1) {
if ("ship".equals(action)) {
System.out.println("订单已发货");
}
} else if (status == 2) {
if ("confirm".equals(action)) {
System.out.println();
}
}
}
}


