状态模式
State — 对象的行为随内部状态改变而改变
一句话理解
把每种状态下的行为封装成独立的类,状态切换时,行为自动跟着变。消灭 if-else 状态判断。
解决什么问题
// 反面教材:到处是状态判断
public void handle() {
if (state == "待支付") { ... }
else if (state == "已支付") { ... }
else if (state == "已发货") { ... }
// 越来越多...
}状态模式让每个状态"自己知道该怎么做"和"下一步转到哪"。
怎么写
以"订单状态机"为例:
// 状态接口
public interface OrderState {
void handle(OrderContext context);
}
// 具体状态
public class PendingPayment implements OrderState {
public void handle(OrderContext context) {
System.out.println("处理支付...");
context.setState(new Paid()); // 转到下一个状态
}
}
public class Paid implements OrderState {
public void handle(OrderContext context) {
System.out.println("准备发货...");
context.setState(new Shipped());
}
}
public class Shipped implements OrderState {
public void handle(OrderContext context) {
System.out.println("订单已完成!");
}
}
// 上下文:持有当前状态
public class OrderContext {
private OrderState state;
public OrderContext() {
this.state = new PendingPayment(); // 初始状态
}
public void setState(OrderState state) { this.state = state; }
public void proceed() {
state.handle(this); // 委托给当前状态处理
}
}OrderContext order = new OrderContext();
order.proceed(); // 处理支付...
order.proceed(); // 准备发货...
order.proceed(); // 订单已完成!和策略模式的区别
| 状态模式 | 策略模式 | |
|---|---|---|
| 切换 | 状态之间自动流转 | 由客户端主动选择 |
| 关注 | 对象在不同状态下行为不同 | 同一行为有多种实现方式 |
| 状态感知 | 状态对象知道下一个状态是谁 | 策略对象不知道其他策略 |
使用场景
- 订单状态机(待支付 → 已支付 → 已发货 → 已完成)
- TCP 连接状态(LISTEN → SYN_SENT → ESTABLISHED → CLOSED)
- 游戏角色状态(站立 → 跑动 → 跳跃 → 攻击)
- 工作流引擎