模式介绍

状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为,使对象看起来似乎修改了它的类。状态模式将状态封装成独立的类,并将动作委托到代表当前状态的对象。

使用场景

  • 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时
  • 当代码中包含大量与对象状态有关的条件语句时
  • 当对象的状态转换逻辑比较复杂时

代码示例

// 状态接口
public interface State {
    void handle(Context context);
}

// 上下文类
public class Context {
    private State state;

    public Context(State state) {
        this.state = state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void request() {
        state.handle(this);
    }
}

// 具体状态A
public class ConcreteStateA implements State {
    @Override
    public void handle(Context context) {
        System.out.println("State A handling request");
        context.setState(new ConcreteStateB());
    }
}

// 具体状态B
public class ConcreteStateB implements State {
    @Override
    public void handle(Context context) {
        System.out.println("State B handling request");
        context.setState(new ConcreteStateA());
    }
}

优缺点

优点

  • 将与特定状态相关的代码局部化
  • 消除了庞大的条件分支语句
  • 使状态转换显式化

缺点

  • 增加了系统中类的数量
  • 状态转换逻辑可能变得复杂
  • 可能导致状态类之间的耦合