2

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

“好莱坞原则,不要叫我们,我们叫你”

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

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

我的问题是……这个例子是否违反了不叫我们,我们叫你的原则?这也来自使用状态模式的书。

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需要NoQuarterStateinsertQuarterBehavior()来作为它自己的insertQuarterBehavior,所以这意味着GumballMachine类是高级组件,而NoquarterState类是低级组件。但是看看NoQuarterState类,该类还依赖于gumballMachine 的 setState()getHasQuarterState()insertQuarter() 行为

他们相互依赖。通函 - 依赖关系

4

3 回答 3

1

您应该将 GumballMachine 视为州运作的环境。此模式要求状态能够获得对任何其他状态的引用并更改当前状态。这意味着这里是紧密耦合的,允许 GumballMachine 与状态级逻辑无关,但负责状态的生命周期及其共享的参考点。

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

于 2012-04-22T13:46:57.447 回答
1

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

NoQuarterState与机器(以及任何其他机器)associated有关,这是有道理的,因为只有知道在其处理后要遵循的下一个正确状态是哪个,有效地使盒子根据每个状态的结果移动。这样,可以在不知道一种状态如何或在什么条件下跟随另一种状态的情况下发生变化。这被封装在具体实例中。 GumballStateNoQuarterStateGumballGumballStateState

事实上,Gumball唯一知道的States是它的各种代码getterssetters你的代码。它调用的唯一方法是属于State和不属于NoQuarterState等的方法。
因此,尽管这是一个可以改进的相当简化的示例(顺便说一句,不认为允许从书中复制粘贴示例),但它本身并不违反您所询问的原则,Holywood原则的核心思想是关于松散耦合,此代码不违反它恕我直言

于 2012-04-22T11:55:28.267 回答
0

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

于 2013-02-18T00:58:06.823 回答