Skip to content

状态模式

字数: 0 字 时长: 0 分钟

简介

状态模式(State Pattern)核心思想是:允许对象在内部状态变化时,改变它的行为,看起来就行是对象本身发生变化了一样。在实际开发中,有的对象的行为是依赖内部状态变化的,如果直接在对象内部用一堆 if-else 来处理,很快代码会变得又长又难懂,而且新增或修改状态时,会修改整个对象的代码,违反了开闭原则。

比如订单处理过程中,待支付、已支付、待发货、已发货、已完成等状态流转非常适合使用状态模式将每个状态封装为一个独立类。

UML 类图

state.webp

  • 上下文类(Context):持有当前状态对象,负责状态的切换,同时对外暴露统一的行为接口
  • 抽象状态类(State):定义所有具体状态需要实现的接口或抽象类
  • 具体状态类(ConcreteState):实现抽象状态类定义的接口,每个具体状态类封装了具体的操作逻辑,并且可以决定是否切换到其他状态

实现示例

以“订单状态流转管理”为例:

java
// 1. 定义订单状态接口
interface OrderState {
    void handleRequest(Order order); 
}

// 2. 实现具体状态类
class PendingState implements OrderState {
    @Override
    public void handleRequest(Order order) {
        System.out.println("订单待支付");
        order.setState(new PaidState()); // 切换到已支付状态
    }
}
class PaidState implements OrderState {
    @Override
    public void handleRequest(Order order) {
        System.out.println("订单已支付,请进行发货");
        order.setState(new ShippedState()); // 切换到已发货状态
    }
} 
class ShippedState implements OrderState {
    @Override
    public void handleRequest(Order order) {
        System.out.println("订单已发货,请进行收货");
        order.setState(new CompletedState); // 收获后,订单完成
    }
}
class CompletedState implements OrderState {
    @Override
    public void handleRequest(Order order) {
        System.out.println("订单已完成");
    }
}

// 3. 定义订单类 (上下文类)
class Order {
    private OrderState state;
    public Order() {
        this.state = new PendingState(); // 初始状态为待支付
    }
    public void setState(OrderState state) {
        this.state = state;
    }
    public void request() {
        state.handleRequest(this);
    }
}

// 4. 调用示例
public static void main(String[] args) {
    Order order = new Order();
    order.request(); // 待支付
    order.request(); // 已支付
    order.request(); // 已发货
    order.request(); // 已完成
}