状态模式(State Pattern)
状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态发生变化时,改变其行为。状态模式将对象的状态封装成不同的状态对象,使对象的行为取决于其当前状态。这种模式有助于减少条件语句的复杂性,将状态转换和状态相关的行为封装到状态对象中。
状态模式的核心思想是将对象的状态抽象成状态类,每个状态类负责实现特定状态下的行为。上下文类(Context)包含对状态对象的引用,并在需要时将状态切换到不同的状态。
场景
对象具有多种状态:当对象具有多种状态,并且不同状态下有不同的行为时,状态模式非常适用。
消除大量条件语句:状态模式可以用于消除大量的条件分支语句,使代码更加清晰和易于维护。
状态切换需求频繁:如果状态之间的切换需求频繁,并且每种状态下有不同的行为,状态模式可以帮助管理状态转换。
行为随状态变化:当对象的行为需要根据内部状态的变化而变化时,状态模式非常有用。
实现
// 抽象状态类
class State {
handleRequest() {
throw new Error("handleRequest method must be overridden");
}
}
// 具体状态类
class ClosedState extends State {
handleRequest() {
console.log("Elevator is closed. Opening...");
return new OpeningState();
}
}
class OpeningState extends State {
handleRequest() {
console.log("Elevator is opening. Opened.");
return new OpenedState();
}
}
class OpenedState extends State {
handleRequest() {
console.log("Elevator is opened. Closing...");
return new ClosingState();
}
}
class ClosingState extends State {
handleRequest() {
console.log("Elevator is closing. Closed.");
return new ClosedState();
}
}
// 上下文,包含状态
class Elevator {
constructor() {
this.state = new ClosedState();
}
request() {
this.state = this.state.handleRequest();
}
}
// 客户端代码
const elevator = new Elevator();
elevator.request(); // Elevator is closed. Opening...
elevator.request(); // Elevator is opening. Opened.
elevator.request(); // Elevator is opened. Closing...
elevator.request(); // Elevator is closing. Closed.
在上面的示例中,State 是抽象状态类,它包含一个 handleRequest 方法,用于处理状态转换。具体状态类如 ClosedState、OpeningState 等都继承自 State,并实现了 handleRequest 方法来执行不同状态下的行为。
Elevator 是上下文类,它包含对当前状态对象的引用,并在需要时切换到不同的状态。客户端代码通过调用 elevator.request() 来模拟状态的转换。
状态模式允许对象在内部状态发生变化时,改变其行为,而无需在对象中添加大量的条件分支语句。这使得代码更加模块化、清晰和易于维护。状态模式在建模对象具有多个状态,并需要管理状态之间的转换时非常有用。