java 谁定义状态模式中的状态转换?

r1zhe5dt  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(68)

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

myzjeezk

myzjeezk1#

来自GOF设计模式书(在实现部分):

  • 1.谁定义状态转换?状态模式不指定哪个参与者定义状态转换的标准。如果标准是固定的,那么它们可以完全在上下文中实现。不过,一般来说,让国家的小类自己具体说明其继承国和何时进行过渡更为灵活和适当。这需要向Context添加一个接口,让State对象显式地设置Context的当前状态。
  • 以这种方式去中心化转换逻辑使得通过定义新的State子类来修改或扩展逻辑变得容易。去中心化的一个缺点是,一个State子类将至少知道另一个子类,这在子类之间引入了实现依赖性。
xam8gpfp

xam8gpfp2#

可能是一个比较具体的例子可以澄清。我希望我的理解是正确的
假设洗衣机具有两种状态(开、关)。以下是GoF词汇:

  • Context =>洗衣机
  • 状态=>洗衣机状态
  • 具体状态=> StateOn,StateOff

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

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())
   }
}

只要记住有几种方法来实现它,创造力有助于!

62lalag4

62lalag43#

我喜欢的一种状态转换模式是为两个状态之间的每个转换使用单独的类。
这允许状态仅负责进入、执行和退出此状态时发生的情况,但单独的代码控制从一个状态到另一个状态的转换。当一个复杂的动作只需要在一个转换到另一个转换时,这允许更具体的操作。

相关问题