允许一个对象在其内部状态改变时改变它的行为。例如:交通灯
解决问题:
- 含有大量判断的操作依赖状态的改变
优点:
- 结构清晰
- 符合开放-封闭原则
- 封装良好
缺点:
- 增加复杂度
使用场景:
- 含有大量判断的操作依赖状态的改变
与其他设计模式的区别:
- 状态模式:重在强调对象内部状态的变化改变对象的行为,状态之间是平衡的,无法相互替换
- 策略模式:策略的选择由外部条件决定,策略之间是平等的,可以相互替换
/* 抽象状态类 */
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);