16

我知道State patterncan 可用于对根据状态改变行为的对象进行建模,并且Contextcan 具有的各种状态封装在表示Stateinterface 的具体类中。我不清楚的是在这种模式下状态转换是如何发生的。个人是否states知道并决定跟随他们的人,还是Context决定下一个状态的人?

4

2 回答 2

14

来自 GOF 设计模式书(在实施部分中有):

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

以这种方式去中心化转换逻辑可以通过定义新的 State 子类来轻松修改或扩展逻辑。去中心化的一个缺点是一个 State 子类将至少了解另一个 State,这会在子类之间引入实现依赖关系。

于 2013-01-21T07:36:38.263 回答
5

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

假设洗衣机有两种状态(开、关)。以下 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())
   }
}

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

于 2013-07-09T05:22:06.513 回答