深入浅出设计模式十二-状态模式(行为型)
定义:
状态模式: 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.
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;
}
@Override
public void ejectQuarter() {
System.out.println("You haven't inserted money");
}
@Override
public void insertQuarter() {
System.out.println("You insert a Quarter");
gumballMachine.setState(gumballMachine.getHasQuarterState());
}
@Override
public void turnCrank() {
System.out.println("You turned ,but no quarter");
}
@Override
public 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;
}
@Override
public void ejectQuarter() {
System.out.println("Quarter returned");
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
@Override
public void insertQuarter() {
System.out.println("Have inserted already,Coudn't insert again");
}
@Override
public void turnCrank() {
System.out.println("You turned");
gumballMachine.setState(gumballMachine.getSoldState());
}
@Override
public 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;
}
@Override
public void dispense() {
System.out.println("dispense....");
gumballMachine.releaseBall();
if(gumballMachine.count>0){
gumballMachine.setState(gumballMachine.getNoQuarterState());
}else{
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
@Override
public void ejectQuarter() {
System.out.println("you state not permit this action");
}
@Override
public void insertQuarter() {
System.out.println("you state not permit this action");
}
@Override
public 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;
}
@Override
public void dispense() {
System.out.println("sold out");
}
@Override
public void ejectQuarter() {
System.out.println("sold out");
}
@Override
public void insertQuarter() {
System.out.println("sold out");
}
@Override
public 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 Quarter
You turned
dispense....
release a Quarter,the Number left : 9
比较一下状态模式与策略模式我们发现它们的类图基本相同.它们的区别主要在使用它们的意图.