谁在州模式中定义状态转换?

Gee*_*eek 15 java state design-patterns

我知道State pattern可以用来模拟根据状态改变行为的对象,并且Context可以具有的各种状态被封装在表示State接口的具体类中.我不清楚的是状态转换是如何在这种模式中发生的.个人是否states知道并决定谁跟随他们,或者Context决定下一个会接下来的状态?

use*_*577 11

从GOF设计模式书(这是在实现部分):

1.谁定义了国家转型?状态模式未指定哪个参与者定义状态转换的标准.如果标准是固定的,那么它们可以完全在上下文中实现.然而,通常更灵活和适当的是让State子类本身指定其后继状态以及何时进行转换.这需要向Context添加一个接口,让State对象显式设置Context的当前状态.

以这种方式分散转换逻辑可以通过定义新的State子类来轻松修改或扩展逻辑.分散化的缺点是一个State子类将至少知道另一个子类,这引入了子类之间的实现依赖性.


Sha*_*ple 5

可能是一个比较具体的例子可以说明。我希望我理解正确

假设一台洗衣机有两种状态(ON、Off)。遵循 GoF 词汇:

  • 上下文 => 洗衣机
  • 状态 => WashingMachineState
  • 具体状态 => StateOn, StateOff

对于状态转换,通过状态子类(在我们的例子中为 StateOn 和 StateOff),我们需要有一个方法来改变状态上下文:

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())
   }
}
Run Code Online (Sandbox Code Playgroud)

请记住,有几种方法可以实现它,创造力会有所帮助!