在 TypeScript 中实现状态模式相对直接,可以利用类和接口来封装状态行为。简单实现以下
示例:文档状态管理
假设我们有一个文档系统,文档可以在“草稿(Draft)”、“审查(Review)”和“发布(Published)”三种状态之间转换。我们将使用状态模式来实现这个系统。
1. 定义状态接口
首先,我们定义一个 State
接口,定义了不同状态所需的方法。
interface State {
handleRequest(context: DocumentContext): void;
}
2. 实现具体状态类
然后,我们实现具体的状态类,分别对应于“草稿”、“审查”和“发布”状态。
class DraftState implements State {
handleRequest(context: DocumentContext): void {
console.log("Document is in draft state.");
context.setState(new ReviewState()); // 转换状态为审查状态
}
}
class ReviewState implements State {
handleRequest(context: DocumentContext): void {
console.log("Document is under review.");
context.setState(new PublishedState()); // 转换状态为发布状态
}
}
class PublishedState implements State {
handleRequest(context: DocumentContext): void {
console.log("Document is published.");
// 这里可以选择不转换状态
}
}
3. 创建上下文类
接下来,我们创建一个上下文类 DocumentContext
,它持有当前状态的引用并提供状态切换的方法。
class DocumentContext {
private state: State;
constructor(initialState: State) {
this.state = initialState;
}
setState(state: State): void {
this.state = state;
}
request(): void {
this.state.handleRequest(this);
}
}
4. 使用状态模式
最后,我们可以创建上下文实例,并通过不同的方法调用来处理状态转换。
// 使用示例
const document = new DocumentContext(new DraftState());
// 处理请求,转换状态
document.request(); // 输出: Document is in draft state.
document.request(); // 输出: Document is under review.
document.request(); // 输出: Document is published.
总结
在这个示例中,我们展示了如何在 TypeScript 中实现状态模式。我们定义了状态接口和多个具体状态类,以及一个上下文类来管理状态的转换。通过这种方法,系统在不同状态下的行为是清晰的,易于扩展和维护。
如果需要添加新的状态,只需创建新的状态类并实现 State
接口,然后在 DocumentContext
类中进行相应的状态转换即可。这使得整个系统灵活且具有良好的可维护性。