首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计方式之命令(State)模式

2012-11-09 
设计模式之命令(State)模式???? 状态模式是在程序开发时,经常用到的模式。如果没有应用过,而实现业务功能。

设计模式之命令(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;}   }

?

热点排行