TypeScript设计模式(8):状态模式

74 阅读2分钟

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-elseswitch-case 语句来处理不同状态。
  • 需要封装不同状态的逻辑,使其独立变化并且易于扩展。

5. 状态模式的优缺点

优点

✅ 避免大量 if-else 逻辑,代码更加清晰、易维护。 ✅ 状态封装成独立类,符合开闭原则(OCP),方便扩展新状态。 ✅ 上下文类与具体状态类解耦,提高代码可复用性。

缺点

❌ 可能会增加类的数量,导致系统复杂度提高。 ❌ 状态转换逻辑需要在多个状态类中维护,可能引入一定的维护成本。

6. 总结

状态模式是一种强大的设计模式,在 TypeScript 及面向对象编程中广泛使用。通过将状态封装成独立的类,可以让代码更加清晰、易维护,并符合 SOLID 原则。适用于状态变化较多且需要封装状态行为的场景

希望这篇文章能帮助你理解状态模式!🚀