我是最先设计模式的读者,我注意到了这一点。
“好莱坞原则,不要给我们打电话,我们给您打电话”
这意味着高级别的组件告诉低级别的组件“不要打电话给我们,我们给您打电话”
高级组件是一个类,它的行为与其他低级组件一起定义。
我的问题是...此示例违反了请勿致电我们,我们称您为原则吗?这也来自使用状态模式的书。
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
机器相关/属于该状态,并且将是实例化的唯一中心他们。这也是添加/删除它们的唯一位置。因此,具体类的实例化在代码中位于一个位置。NoQuarterState
在associated
机器上是Gumball
(以及与此有关的任何其他State
),这是有道理的,因为只有NoQuarterState
知道在处理后有效遵循的下一个正确状态根据每个状态的结果将Gumball
放入一个方框中。这样,Gumball
可以更改State
,而无需知道一个状态遵循另一状态的方式或条件。它封装在State
具体实例中。
实际上,Gumball
仅在其代码中的各种States
和getters
中知道setters
。它调用的唯一方法是属于State
而不属于NoQuarterState
等的方法。
因此,尽管这是一个可以简化的相当简单的示例(BTW认为不允许将示例复制并粘贴到书中),但它并未违反您所问的原则,即Holywood
原则的核心思想关于松散耦合,此代码不会违反它