这个例子违反了好莱坞原则“不要打电话给我们,我们称你为”

时间:2012-04-22 11:29:34

标签: java design-patterns

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

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

这意味着高级组件告诉低级组件“不要打电话给我们,我们称呼你”

高级组件是一个具有BEHAVIOR的类,其中包含其他低级组件。

我的问题是......这个例子违反了不打电话给我们,我们称你为原则?这也来自使用State Pattern的书。

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 需要插入QuadQuarterBehavior() insertQuarterBehavior(),所以这意味着 GumballMachine 类是高级组件, NoquarterState 类是低级组件。但是看看 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

3 个答案:

答案 0 :(得分:1)

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

NoQuarterState associatedGumball机器(以及此问题的任何其他StateNoQuarterState因此只有Gumball才知道将是处理后的下一个正确状态,有效地将Gumball移动到一个移动的框中,具体取决于每个状态的结果。这样State可以在不知道一个状态如何或在什么条件下跟随另一个状态的情况下更改State。这封装在Gumball具体实例中。

事实上,States只知道代码中各种getterssetters中的State。它所调用的唯一方法是那些属于NoQuarterState而不属于Holywood等的方法 因此,虽然这是一个可以改进的相当简化的例子(BTW不认为它允许从书中复制粘贴一个例子),但它并没有违反你所要求的原则,{{1}}原则核心思想是关于松散的合作,这个代码并没有违反它恕我直言

答案 1 :(得分:1)

您应该将GumballMachine视为各州运营的背景。这种模式要求各国能够提及任何其他国家并改变现状。这意味着紧密耦合在这里,允许GumballMachine不依赖于状态级逻辑,但负责状态的生命周期及其共享参考点。

原则和模式不是设计工作的最终目标。最后,您必须针对手头的问题提出合适的解决方案,有时某些模式和原则不适用。话虽如此,如果你注意到你真的违反了一个重要的原则(如松散耦合/紧密凝聚力),这表明某些事情可能是错误的,你至少应该问问自己为什么会这样,如果可以避免在你的问题的限制范围内。

答案 2 :(得分:0)

是的,它确实违反了好莱坞原则,正如你指出的那样。但正如同一本书强调的那样,这些原则不是法律,而是经常被违反。例如,回调是对好莱坞原则的普遍和有用的违反。