Python中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (2) 个答案

  1. # 1 楼答案

    从《GOF设计模式》一书(在实现部分):

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

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

  2. # 2 楼答案

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

    假设一台洗衣机有两种状态(开、关)。以下是GoF词汇:

    • 上下文=>;洗衣机
    • 状态=>;洗衣机庄园
    • 具体状态=>;斯塔通,斯塔通

    对于状态转换,通过state子类(在我们的例子中是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())
       }
    }
    

    只要记住,有几种方法可以实现它,创造力很有帮助