Im头部设计模式的读者,我注意到了这一点。这个例子违反了好莱坞的原则“不要打电话给我们,我们给你打电话”
“好莱坞原则,不要打电话给我们,我们给你打电话”
这意味着高层次的组件告诉低层组件“不要打电话给我们,我们给你打电话”
高级组件是一个与其他低级组件定义的BEHAVIOR类。
我的问题是......这个例子违反了不要打电话给我们,我们称之为原则吗?这也来自使用状态模式的书。
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需要NoQuarterState的insertQuarterBehavior()为自己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
是的,我完全同意这是S-H-I-T-T-Y D-E-S-I-G-N这种情况经常发生在作者试图解释其观点仅在大型项目中显而易见的概念时,但在这样一个简单的例子中。这是过度工程和分工几乎杂乱无章。有一件事让我感到奇怪:如果这是来自一本书,它怎么不尊重无处不在的java命名约定?实例字段必须遵循lowerCamelCase约定。 – 2012-04-22 11:35:43
@MarkoTopolnik我想它是由原始海报手动重新输入。这里是该书的原始版本:http://comet.lehman.cuny.edu/cocchi/CMP346/state/GumballMachine.java – bezmax 2012-04-22 11:55:59
我明白了。那么,在那个代码中,设计错误还没有被提交。这就是你提到的海报的全部内容。 'State'对象应该返回**新的状态,而不是直接将它设置在父对象上。这就是设计误入歧途的地方。它是可以修复的。 – 2012-04-22 12:01:27