Skip to content

状态模式

什么是状态模式?

状态模式(State Pattern) 是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为。看起来就像改变了它的类一样。

核心思想:将对象的行为封装在不同的状态类中,当状态改变时,对象的行为也随之改变。

核心角色

  1. Context(上下文):持有当前状态的对象
  2. State(状态接口):定义状态的公共接口
  3. ConcreteState(具体状态):实现特定状态下的行为

代码实现:

typescript
//定义每一个状态的抽象接口
abstract class State {
  abstract handle(): void;
}

//以交通信号灯为例,信号灯有三种状态 绿灯 => pass,红灯 => stop,黄灯 => slow

//定义具体的状态类 绿灯状态
class PassState extends State {
  handle(): void {
    console.log("此时是绿灯,可以通行");
    setTimeout(() => {
      $context.switchState(new SlowState());
      $context.go();
    }, 3000);
  }
}

//定义具体的状态类 红灯状态
class StopState extends State {
  handle(): void {
    console.log("此时是红灯,等绿灯才能通行");
    setTimeout(() => {
      $context.switchState(new PassState());
      $context.go();
    }, 3000);
  }
}

//定义具体的状态类 红灯状态
class SlowState extends State {
  handle(): void {
    console.log("此时是黄灯,请缓慢通行");
    setTimeout(() => {
      $context.switchState(new StopState());
      $context.go();
    }, 3000);
  }
}

//核心角色,上下文类
class Context {
  constructor(private stateInstance: State) {}

  /**
   * 设置当前状态
   * @param state
   */
  public switchState(state: State) {
    this.stateInstance = state;
  }

  /**
   * 在当前状态下执行处理函数
   * @returns void
   */
  public go() {
    this.stateInstance.handle();
  }
}

//以红灯状态为初始状态
const $context = new Context(new StopState());

$context.go();