我是最先设计模式的读者,我注意到了这一点。

“好莱坞原则,不要给我们打电话,我们给您打电话”

这意味着高级别的组件告诉低级别的组件“不要打电话给我们,我们给您打电话”

高级组件是一个类,它的行为与其他低级组件一起定义。

我的问题是...此示例违反了请勿致电我们,我们称您为原则吗?这也来自使用状态模式的书。

public class GumballMachine
{
    //other state instance here

    State NoQuarterState;
    State HasQuarterState;

    public GumballMachine(int numberGumballs)
    {
        NoQuarterState = new NoQuarterState(this);
        HasQuarterState = new HasQuarterState(this);

        //other state objects here assigning to state instance
    }

    public void insertQuarter()
    {
        state.insertQuarter();
    }

    void setState(State state)
    {
        this.state = state;
    }

    public State getHasQuarterState()
    {
        return hasQuarterState;
    }

    //more code here
}


================================================== ==================

public interface State
{
    //abstract methods
}


================================================== ==================

public class NoQuarterState implements State
{
    GumballMachine gumballMachine;

    public NoQuarterState(GumballMachine gumballMachine)
    {
        this.gumballMachine = gumballMachine;
    }

    public void insertQuarter()
    {
        System.out.println("You inserted a quarter");
        gumballMachine.setState(gumballMachine.getHasQuarterState()); // change the state to HasQuarterState
    }
}


因为在此示例中,GumballMachine为其自己的insertQuarterBehavior需要NoQuarterState的insertQuarterBehavior(),所以这意味着GumballMachine类是High-Level组件,而NoquarterState类是Low-level组件。但请看一下NoQuarterState类,该类还依赖gumballMachine的setState()和getHasQuarterState()来实现insertQuarter()行为。

他们彼此依赖。 C-I-R-C-U-L-A-R-D-E-P-E-N-D-E-N-C-I-E-S

最佳答案

首先,您应该阅读有关State Pattern的信息。
您发布的内容是一个相当简单的版本。在您发布的代码中,唯一一次调用new的时间是在Gumball机器中,这实际上还不错,因为状态与Gumball机器相关/属于该状态,并且将是实例化的唯一中心他们。这也是添加/删除它们的唯一位置。因此,具体类的实例化在代码中位于一个位置。

NoQuarterStateassociated机器上是Gumball(以及与此有关的任何其他State),这是有道理的,因为只有NoQuarterState知道在处理后有效遵循的下一个正确状态根据每个状态的结果将Gumball放入一个方框中。这样,Gumball可以更改State,而无需知道一个状态遵循另一状态的方式或条件。它封装在State具体实例中。

实际上,Gumball仅在其代码中的各种Statesgetters中知道setters。它调用的唯一方法是属于State而不属于NoQuarterState等的方法。
因此,尽管这是一个可以简化的相当简单的示例(BTW认为不允许将示例复制并粘贴到书中),但它并未违反您所问的原则,即Holywood原则的核心思想关于松散耦合,此代码不会违反它

10-02 16:19