我了解到 状态模式(State pattern)
可以用于建模根据不同状态而变化行为的对象,而Context
所具有的不同状态则被封装在代表State
接口的具体类中。然而,我并不清楚这个模式中状态的转换是如何发生的。是各个State
知道并决定了下一个状态,还是由Context
决定其下一个状态?
我了解到 状态模式(State pattern)
可以用于建模根据不同状态而变化行为的对象,而Context
所具有的不同状态则被封装在代表State
接口的具体类中。然而,我并不清楚这个模式中状态的转换是如何发生的。是各个State
知道并决定了下一个状态,还是由Context
决定其下一个状态?
来自《GOF设计模式》书籍(这段内容出现在实现部分):
1. 谁定义状态转换?状态模式没有指定哪个参与者定义状态转换的标准。如果标准是固定的,那么它们可以完全在上下文中实现。然而,更加灵活和适当的做法是让状态子类自己指定其后继状态以及何时进行转换。这需要在上下文中添加一个接口,让状态对象显式地设置上下文的当前状态。
通过以这种方式分散转换逻辑,可以很容易地通过定义新的状态子类来修改或扩展逻辑。分散化的缺点是一个状态子类将了解至少另一个状态子类,这引入了子类之间的实现依赖关系。
class WashingMachine {
WashingMachineState state;
...
protected void setState(WashingMachineState newState) {
state = newState;
}
someMethod () {
...
state.pushStartButton(this);
...
}
}
abstract class WashingMachineState {
protected void run();
protected void pushStartButton(WashingMachine wm);
}
class StateOn extends WashingMachineState {
...
void pushStartButton(WashingMachine wm) {
wm.setState(new StateOff())
}
}
class StateOff extends WashingMachineState {
...
void pushStartButton(WashingMachine wm) {
wm.setState(new StateOn())
}
}
请记住,有多种实现方法,创造力是有帮助的!