状态模式

 

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

  将一群行为封装在状态对象中,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 }
State

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

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);
View Code


 The first blog...

posted on 2014-06-20 10:38  围栏里的猪  阅读(77)  评论(0)    收藏  举报