My App

状态模式

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)
  • 游戏角色状态(站立 → 跑动 → 跳跃 → 攻击)
  • 工作流引擎

On this page