1. 状态模式简介
状态模式(State Pattern) 是一种行为设计模式,它允许对象在内部状态改变时改变自身的行为。换句话说,状态模式将状态封装成独立的类,使得不同状态下的对象行为可以独立变化。
2. 状态模式的核心概念
- Context(上下文): 维护当前状态,并在状态改变时切换到不同的状态。
- State(状态接口): 定义所有具体状态的公共接口。
- ConcreteState(具体状态): 实现
State接口,封装具体状态下的行为。
3. TypeScript 实现状态模式
3.1 定义状态接口
// 状态接口
interface State {
handle(context: Context): void;
}
3.2 具体状态类
// 具体状态 A
class ConcreteStateA implements State {
handle(context: Context): void {
console.log("当前状态:A -> 切换到状态 B");
context.setState(new ConcreteStateB());
}
}
// 具体状态 B
class ConcreteStateB implements State {
handle(context: Context): void {
console.log("当前状态:B -> 切换到状态 A");
context.setState(new ConcreteStateA());
}
}
3.3 上下文类
// 上下文类
class Context {
private state: State;
constructor(state: State) {
this.state = state;
}
setState(state: State): void {
this.state = state;
}
request(): void {
this.state.handle(this);
}
}
3.4 测试状态模式
// 初始化上下文
const context = new Context(new ConcreteStateA());
// 触发状态切换
context.request(); // 当前状态:A -> 切换到状态 B
context.request(); // 当前状态:B -> 切换到状态 A
4. 状态模式的应用场景
状态模式适用于以下情况:
- 对象的行为依赖于其内部状态,并且需要在运行时根据状态进行切换。
- 代码中存在大量的
if-else或switch-case语句来处理不同状态。 - 需要封装不同状态的逻辑,使其独立变化并且易于扩展。
5. 状态模式的优缺点
优点
✅ 避免大量 if-else 逻辑,代码更加清晰、易维护。
✅ 状态封装成独立类,符合开闭原则(OCP),方便扩展新状态。
✅ 上下文类与具体状态类解耦,提高代码可复用性。
缺点
❌ 可能会增加类的数量,导致系统复杂度提高。 ❌ 状态转换逻辑需要在多个状态类中维护,可能引入一定的维护成本。
6. 总结
状态模式是一种强大的设计模式,在 TypeScript 及面向对象编程中广泛使用。通过将状态封装成独立的类,可以让代码更加清晰、易维护,并符合 SOLID 原则。适用于状态变化较多且需要封装状态行为的场景。
希望这篇文章能帮助你理解状态模式!🚀