Skip to content

Latest commit

 

History

History
115 lines (98 loc) · 2.58 KB

14状态模式.md

File metadata and controls

115 lines (98 loc) · 2.58 KB

状态模式

允许一个对象在其内部状态改变时改变它的行为。例如:交通灯

解决问题:

  • 含有大量判断的操作依赖状态的改变

优点:

  • 结构清晰
  • 符合开放-封闭原则
  • 封装良好

缺点:

  • 增加复杂度

使用场景:

  • 含有大量判断的操作依赖状态的改变

与其他设计模式的区别:

  • 状态模式:重在强调对象内部状态的变化改变对象的行为,状态之间是平衡的,无法相互替换
  • 策略模式:策略的选择由外部条件决定,策略之间是平等的,可以相互替换

代码实现

/* 抽象状态类 */
class AbstractState {
  constructor() {
    if (new.target === AbstractState) {
      throw new Error("抽象类不能直接实例化!");
    }
  }
  /* 抽象方法 */
  employ() {
    throw new Error("抽象方法不能调用!");
  }
  changeState() {
    throw new Error("抽象方法不能调用!");
  }
}

/* 交通灯类-红灯 */
class RedState extends AbstractState {
  constructor() {
    super();
    this.colorState = "红色";
  }
  /* 覆盖抽象方法 */
  employ() {
    console.log("交通灯颜色变为 " + this.colorState + ",行人通行 & 车辆等待");
  }
  changeState(trafficLight) {
    trafficLight.setState(trafficLight.yellowState);
  }
}

/* 交通灯类-绿灯 */
class GreenState extends AbstractState {
  constructor() {
    super();
    this.colorState = "绿色";
  }
  /* 覆盖抽象方法 */
  employ() {
    console.log("交通灯颜色变为 " + this.colorState + ",行人等待 & 车辆通行");
  }

  changeState(trafficLight) {
    trafficLight.setState(trafficLight.redState);
  }
}

/* 交通灯类-黄灯 */
class YellowState extends AbstractState {
  constructor() {
    super();
    this.colorState = "黄色";
  }
  /* 覆盖抽象方法 */
  employ() {
    console.log("交通灯颜色变为 " + this.colorState + ",行人等待 & 车辆等待");
  }

  changeState(trafficLight) {
    trafficLight.setState(trafficLight.greenState);
  }
}

/* 交通灯类 */
class TrafficLight {
  constructor() {
    this.redState = new RedState();
    this.greenState = new GreenState();
    this.yellowState = new YellowState();

    this.state = this.redState;
  }
  /* 设置交通灯状态 */
  setState(state) {
    state.employ(this);
    this.state = state;
  }

  changeState() {
    this.state.changeState(this);
  }
}

const trafficLight = new TrafficLight();

setInterval(() => {
  trafficLight.changeState();
}, 1000);

参考

JavaScript 设计模式精讲 - 第四章 20状态模式