状态模式
状态模式允许对象内部改变状态时,改变他的行为,对象看起来好像修改了它的类。
将一群行为封装在状态对象中,context的行为随时可委托给对象中的一个,随着时间的流逝,当前状态在状态对象中游走改变,以反映出context的内部状态,因此context的行为也会随着改变。但是context的客户对于状态对象了解不多,甚至根本浑然不觉。下面给出示例糖果机代码。
1.糖果机的五个状态
1 public interface State { 2 /**插入硬币**/ 3 void insertQuarter() ; 4 /**退出硬币**/ 5 void ejectQueater(); 6 /**转动曲柄**/ 7 void turnCrank(); 8 /**发放糖果**/ 9 void dispense(); 10 11 }
2.NoQuarterState:没有插入硬币状态
1 public class NoQuarterState implements State{ 2 GuballMachine gMachine; 3 4 public NoQuarterState(GuballMachine guballMachine){ 5 this.gMachine=guballMachine; 6 } 7 8 @Override 9 public void insertQuarter() { 10 System.out.println("NoQuarterState:你插入了一枚硬币"); 11 gMachine.setState(gMachine.getHasQuarterState()); 12 } 13 14 @Override 15 public void ejectQueater() { 16 System.out.println("NoQuarterState:你没有硬币"); 17 } 18 19 @Override 20 public void turnCrank() { 21 System.out.println("NoQuarterState:虽然你转了,但是你木有给你你造么?"); 22 } 23 24 @Override 25 public void dispense() { 26 System.out.println("你NoQuarterState:钱都木给,还想吃糖"); 27 } 28 29 }
3.HasQuarterState:有硬币状态
1 import java.util.Random; 2 3 public class HasQuarterState implements State{ 4 GuballMachine guballMachine; 5 Random random=new Random(System.currentTimeMillis()); 6 7 public HasQuarterState(GuballMachine guballMachine){ 8 this.guballMachine=guballMachine; 9 } 10 11 @Override 12 public void insertQuarter() { 13 System.out.println("HasQuarterState:已经有一枚硬币了 ,你老真有钱,居然给两次"); 14 } 15 16 @Override 17 public void ejectQueater() { 18 System.out.println("HasQuarterState:退你25分钱"); 19 guballMachine.setState(guballMachine.getNoQuarterState()); 20 } 21 22 @Override 23 public void turnCrank() { 24 System.out.println("HasQuarterState:转动曲柄"); 25 int win=random.nextInt(10); 26 System.out.println("HasQuarterState:HasQuarterState"+win); 27 if(win==0 && guballMachine.getCount()>1){ 28 guballMachine.setState(guballMachine.getWinState()); 29 }else{ 30 guballMachine.setState(guballMachine.getSoldState()); 31 } 32 } 33 34 @Override 35 public void dispense() { 36 System.out.println("木有糖果派发了"); 37 } 38 39 }
4.SoldState :售卖状态
1 public class SoldState implements State{ 2 private GuballMachine guballMachine; 3 4 public SoldState(GuballMachine guballMachine){ 5 this.guballMachine=guballMachine; 6 } 7 8 @Override 9 public void insertQuarter() { 10 // TODO Auto-generated method stub 11 System.out.println("SoldState:你已经有一枚硬币了,钱又多是么?"); 12 } 13 14 @Override 15 public void ejectQueater() { 16 // TODO Auto-generated method stub 17 System.out.println("SoldState:你已经转动曲柄了"); 18 } 19 20 @Override 21 public void turnCrank() { 22 // TODO Auto-generated method stub 23 System.out.println("SoldState:你转两次也不会有两个糖果的"); 24 } 25 26 @Override 27 public void dispense() { 28 // TODO Auto-generated method stub 29 guballMachine.realeaseBall(); 30 if(guballMachine.getCount()>0){ 31 System.out.println("恭喜你得到了一个糖果"); 32 guballMachine.setState(guballMachine.getNoQuarterState()); 33 }else{ 34 System.out.println("已经没有糖果了"); 35 guballMachine.setState(guballMachine.getSoldOutState()); 36 } 37 38 } 39 40 }
5.SoldOutState:木有糖果
1 public class SoldOutState implements State{ 2 private GuballMachine guballMachine; 3 public SoldOutState(GuballMachine guballMachine){ 4 this.guballMachine=guballMachine; 5 } 6 7 @Override 8 public void insertQuarter() { 9 System.out.println("SoldOutState:糖果木有了, 你不能投钱了"); 10 } 11 12 @Override 13 public void ejectQueater() { 14 System.out.println("SoldOutState:糖果都没有了,你木有钱了"); 15 } 16 17 @Override 18 public void turnCrank() { 19 System.out.println("SoldOutState:虽然你转动了曲柄,但是你木有钱了"); 20 } 21 22 @Override 23 public void dispense() { 24 System.out.println("SoldOutState:木有糖果了"); 25 } 26 27 }
6.WinState:赢家状态
1 public class WinState implements State{ 2 GuballMachine guballMachine; 3 public WinState(GuballMachine guballMachine){ 4 this.guballMachine=guballMachine; 5 6 } 7 @Override 8 public void insertQuarter() { 9 System.out.println("WinState:你已经投入了一枚硬币"); 10 11 } 12 13 @Override 14 public void ejectQueater() { 15 // TODO Auto-generated method stub 16 System.out.println("WinState:你已经投入了一枚硬币"); 17 } 18 19 @Override 20 public void turnCrank() { 21 // TODO Auto-generated method stub 22 System.out.println("WinState:你已经投入了一枚硬币"); 23 } 24 25 @Override 26 public void dispense() { 27 // TODO Auto-generated method stub 28 System.out.println("WinState:你赢了,系统多赠送给你一枚糖果"); 29 guballMachine.realeaseBall(); 30 if(guballMachine.getCount()==0){ 31 guballMachine.setState(guballMachine.getSoldOutState()); 32 }else{ 33 guballMachine.realeaseBall(); 34 if(guballMachine.getCount()>0){ 35 guballMachine.setState(guballMachine.getNoQuarterState()); 36 }else{ 37 System.out.println("oops ,out of gumbails"); 38 guballMachine.setState(guballMachine.getSoldOutState()); 39 } 40 } 41 } 42 43 }
7:糖果机
1 public class GuballMachine{ 2 State soldOutState; 3 State noQuarterState; 4 State hasQuarterState; 5 State soldState; 6 State winState; 7 8 State state=soldOutState; 9 int count=0; 10 11 public GuballMachine(int numberGumballs){ 12 soldOutState=new SoldOutState(this); 13 noQuarterState=new NoQuarterState(this); 14 hasQuarterState=new HasQuarterState(this); 15 soldState=new SoldState(this); 16 count=numberGumballs; 17 if(numberGumballs>0){ 18 state=noQuarterState; 19 } 20 } 21 22 public void insertQuarter(){ 23 state.insertQuarter(); 24 } 25 26 public void ejectQueater() { 27 state.ejectQueater(); 28 } 29 30 public void turnCrank() { 31 state.turnCrank(); 32 state.dispense(); 33 } 34 35 36 void setState(State state){ 37 this.state=state; 38 } 39 40 void realeaseBall(){ 41 if(count!=0){ 42 count=count-1; 43 } 44 } 45 46 public State getSoldOutState() { 47 return soldOutState; 48 } 49 50 public State getNoQuarterState() { 51 return noQuarterState; 52 } 53 54 public State getHasQuarterState() { 55 return hasQuarterState; 56 } 57 58 public State getWinState(){ 59 return winState; 60 } 61 62 public State getSoldState() { 63 return soldState; 64 } 65 66 public int getCount() { 67 return count; 68 } 69 70 }
8:最后是测试代码
1 //这里客户并不需要知道糖果内部的状态,只需要投币和转动曲柄 2 GuballMachine guballMachine=new GuballMachine(10); 3 guballMachine.insertQuarter(); 4 guballMachine.turnCrank(); 5 6 guballMachine.insertQuarter(); 7 guballMachine.turnCrank(); 8 guballMachine.insertQuarter(); 9 guballMachine.turnCrank(); 10 11 System.out.println(guballMachine);
The first blog...
浙公网安备 33010602011771号