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

深入显出设计模式十二--状态模式(行为型)

2012-11-11 
深入浅出设计模式十二--状态模式(行为型)定义:状态模式: 允许对象在内部状态改变时改变它的行为,对象看起

深入浅出设计模式十二--状态模式(行为型)

定义:

状态模式: 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.

UML图

深入显出设计模式十二--状态模式(行为型)

?

UML解析:

深入显出设计模式十二--状态模式(行为型)

?示例程序:

深入显出设计模式十二--状态模式(行为型)

如上面所示,我们有四个不同的状态,以及四个不同的操作,每个操作都可能改变状态.

运用状态模式代码如下:

package com.lwf.state;public interface State {public void insertQuarter();public void ejectQuarter();public void turnCrank();public void dispense();}

?

package com.lwf.state;public class NoQuarterState implements State{GumballMachine gumballMachine ;public NoQuarterState(GumballMachine gumballMachine){this.gumballMachine = gumballMachine;}@Overridepublic void ejectQuarter() {System.out.println("You haven't inserted money");}@Overridepublic void insertQuarter() {System.out.println("You insert a Quarter");gumballMachine.setState(gumballMachine.getHasQuarterState());}@Overridepublic void turnCrank() {System.out.println("You turned ,but no quarter");}@Overridepublic void dispense() {System.out.println("No money ,Pay first!");}}

?

package com.lwf.state;public class HasQuarterState implements State {GumballMachine gumballMachine ;public HasQuarterState(GumballMachine gumballMachine){this.gumballMachine = gumballMachine;}@Overridepublic void ejectQuarter() {System.out.println("Quarter returned");gumballMachine.setState(gumballMachine.getNoQuarterState());}@Overridepublic void insertQuarter() {System.out.println("Have inserted already,Coudn't insert again");}@Overridepublic void turnCrank() {System.out.println("You turned");gumballMachine.setState(gumballMachine.getSoldState());}@Overridepublic void dispense() {System.out.println("you state not permit this action");}}

?

package com.lwf.state;public class SoldState implements State {GumballMachine gumballMachine ;public SoldState(GumballMachine gumballMachine){this.gumballMachine = gumballMachine;}@Overridepublic void dispense() {System.out.println("dispense....");gumballMachine.releaseBall();if(gumballMachine.count>0){gumballMachine.setState(gumballMachine.getNoQuarterState());}else{gumballMachine.setState(gumballMachine.getSoldOutState());}}@Overridepublic void ejectQuarter() {System.out.println("you state not permit this action");}@Overridepublic void insertQuarter() {System.out.println("you state not permit this action");}@Overridepublic void turnCrank() {System.out.println("you state not permit this action");}}

?

package com.lwf.state;public class SoldOutState implements State {GumballMachine gumballMachine ;public SoldOutState(GumballMachine gumballMachine){this.gumballMachine = gumballMachine;}@Overridepublic void dispense() {System.out.println("sold out");}@Overridepublic void ejectQuarter() {System.out.println("sold out");}@Overridepublic void insertQuarter() {System.out.println("sold out");}@Overridepublic void turnCrank() {System.out.println("sold out");}}

?

package com.lwf.state;public class GumballMachine {State noQuarterState;State hasQuarterState;State soldState;State soldOutState;State state = soldOutState;int count = 0;public GumballMachine(int numberGumballs){noQuarterState = new NoQuarterState(this);hasQuarterState = new HasQuarterState(this);soldState = new SoldState(this);soldOutState = new SoldOutState(this);this.count = numberGumballs;if(numberGumballs > 0){state = noQuarterState;}}public void insertQuarter() {state.insertQuarter();}public void ejectQuarter() {state.ejectQuarter();}public void turnCrank() {state.turnCrank();state.dispense();}public void setState(State state){this.state = state;}public void releaseBall(){if(count!=0){count = count -1;}System.out.println("release a Quarter,the Number left : " + count);}public State getNoQuarterState() {return noQuarterState;}public State getHasQuarterState() {return hasQuarterState;}public State getSoldState() {return soldState;}public State getSoldOutState() {return soldOutState;}public int getCount() {return count;}public static void main(String[] args) {GumballMachine g = new GumballMachine(10);g.insertQuarter();//g.ejectQuarter();g.turnCrank();}}

?

?

运行GumballMachine类当插入一个25分钱后转动转轴, 售出糖果,数量减少一

结果:

You insert a QuarterYou turneddispense....release a Quarter,the Number left : 9

?

比较一下状态模式与策略模式我们发现它们的类图基本相同.它们的区别主要在使用它们的意图.

深入显出设计模式十二--状态模式(行为型)

热点排行