深入浅出设计模式十二--状态模式(行为型)
定义:
状态模式: 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.
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
?
比较一下状态模式与策略模式我们发现它们的类图基本相同.它们的区别主要在使用它们的意图.