设计模式之命令(State)模式
???? 状态模式是在程序开发时,经常用到的模式。如果没有应用过,而实现业务功能。那你也一定是按照状态模式的路子走的,只不过你没有感觉到而已。它的实现,是要根据对象的内部状态变化,而自动执行相应的功能。
费话就不说了,请看一下源代码,这也是我研究设计模式时看到的一个例子,把其翻译成中文,使个位网友能够看懂些,由于水平有限,只能达到这样,还希望网友多指证,也算是抄来的哈哈,谢谢啊。
?
测试就来自已写吧,我提供个思路,就是页面提供几个开关,即按纽、checkbox等在它们的单击事件上GumballMachine实例的内部状态改变。然后看其变化,就可以了。
大家看没看出来,这段代码还有一些“怪的味道”呀,这时如果业务变化了,如果客户是一个中奖的用户,需要糖果机吐出两块糖果,怎么办?,是不是还得在各个方法中把这个状态给加上呀,又得加一个if语句呢,这是一个业务发生了变化,如果业务要无限的变化下去,程序员是不是都要疯了,哈哈。所以要对其进行重构了。
要把这几个状态抽象出来。想到这里看一下代码就明白了。
public class GumballMachineTwo { //所有的状态都在这里 State soldOutState; State noQuarterState; State hasQuarterState; State soldState; State winnerState;//十次抽中一次的游戏,新的状态 //以及实例变量state State state = soldOutState; int count = 0;//记录糖果数量 public GumballMachineTwo(int numberGumballs) { soldOutState = new SoldOutState(this); //每一种状态也都创建一个状态实例 noQuarterState = new NoQuarterState(this); hasQuarterState = new HasQuarterState(this); soldState = new SoldState(this); this.count = numberGumballs; if (numberGumballs > 0) { //如果超过0颗糖果,状态设为noQuarterState state = noQuarterState; } } //委托给当前状态 public void insertQuarter() { state.insertQuarter(); } public void ejectQuarter() { state.ejectQuarter(); } //dispense()是一个内部动作方法,用户不可以直接要求机器发放糖果 public void turnCrank() { state.turnCrank(); state.dispense(); } //允许其他的对象将机器状态转换到不同的状态 void setState(State state) { this.state = state; } //辅助方法释放出糖果,并将count实例变量值减1 void releaseBall() { System.out.println("A gumball comes rolling out the slot..."); if (count != 0) { count = count - 1; } } int getCount() { return count; } void refill(int count) { this.count = count; state = noQuarterState; } public State getState() {return state;} public State getSoldOutState() {return soldOutState;} public State getNoQuarterState() {return noQuarterState;} public State getHasQuarterState() {return hasQuarterState;} public State getSoldState() {return soldState;} public State getWinnerState() {return winnerState;} }?