定义:允许对象在其内部状态改变时改变其行为 类比:就像你玩电子游戏,角色可以根据不同的状态(如健康、受伤、昏迷)执行不同的动作 应用场景 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变其行为 代码中包含大量与对象状态有关的条件语句 优缺点 优点 避免了过多的条件语句 将与状态有关的行为局部化,并将不同状态的行为分割开 缺点 增加了系统类的数量 状态模式的使用需要仔细设计状态的转换 实现代码 // 上下文类 class Context { private state: State; constructor(state: State) { this.transitionTo(state); } public transitionTo(state: State): void { console.log(`Context: Transition to ${state.constructor.name}.`); this.state = state; this.state.setContext(this); } public request1(): void { this.state.handle1(); } public request2(): void { this.state.handle2(); } } // 状态接口 abstract class State { protected context: Context; public setContext(context: Context) { this.context = context; } public abstract handle1(): void; public abstract handle2(): void; } // 具体状态类 class ConcreteStateA extends State { public handle1(): void { console.log('ConcreteStateA handles request1.'); console.log('ConcreteStateA wants to change the state of the context.'); this.context.transitionTo(new ConcreteStateB()); } public handle2(): void { console.log('ConcreteStateA handles request2.'); } } class ConcreteStateB extends State { public handle1(): void { console.log('ConcreteStateB handles request1.'); } public handle2(): void { console.log('ConcreteStateB handles request2.'); console.log('ConcreteStateB wants to change the state of the context.'); this.context.transitionTo(new ConcreteStateA()); } } // 客户端代码 const context = new Context(new ConcreteStateA()); context.request1(); context.request2();