状态模式

1.状态模式:改变对象内部的状态控制,当动作被调用,被委托到当前的状态;          ------ 状态在游走,客户不了解

   策略模式:产生可以互换的算法控制;使用组合引用不同的状态来造成改变的假象; ------ 定制组合,客户定义

2.代码

C++

 1 //state c++
 2 #include <iostream>
 3 using namespace std;
 4 
 5 class State{
 6 public:
 7     virtual void next() = 0; 
 8 };
 9 
10 class Alaskan{
11 public:
12     Alaskan(){}
13     void setState(State * p){
14         m_pState = p;
15     }
16     void nextState(){
17         m_pState->next();
18     }
19 public:
20     State  * eatState;
21     State  * sleepState;
22     State  * playState;
23 private:
24     State * m_pState;
25 };
26 
27 class EatState : public State{
28 public:
29     EatState(Alaskan *p) : m_p(p){}
30     void next(){
31         cout<<"sleeping..."<<endl;
32         m_p->setState(m_p->sleepState);
33     }
34 private:
35     Alaskan *m_p;
36 };
37 
38 class SleepState : public State{
39 public:
40     SleepState(Alaskan *p) : m_p(p){}
41     void next(){
42         cout<<"play..."<<endl;
43         m_p->setState(m_p->playState);
44     }
45 private:
46     Alaskan *m_p;
47 };
48 
49 class PlayState : public State{
50 public:
51     PlayState(Alaskan *p) : m_p(p){}
52     void next(){
53         cout<<"eating..."<<endl;
54         m_p->setState(m_p->eatState);
55     }
56 private:
57     Alaskan *m_p;
58 };
59 
60 int main(){
61     Alaskan * alaskanDog   = new Alaskan();
62     alaskanDog->eatState   = new EatState(alaskanDog);
63     alaskanDog->sleepState = new SleepState(alaskanDog);
64     alaskanDog->playState  = new PlayState(alaskanDog);
65     
66     cout<<"Alaskan is sleeping... "<<endl;
67     alaskanDog->setState(alaskanDog->sleepState);
68     
69     cout<<"1.Alaskan Next: ";
70     alaskanDog->nextState();
71     
72     cout<<"2.Alaskan Next: ";
73     alaskanDog->nextState();
74     
75     cout<<"3.Alaskan Next: ";
76     alaskanDog->nextState();
77     
78     return 0;
79 }

Java:

  1 //state java
  2 class GumballMachine{
  3     State soldOutState;
  4     State noQuarterState;
  5     State hasQuarterState;
  6     State soldState;
  7     
  8     State state = soldOutState;
  9     int count = 0;
 10     public GumballMachine(int numberGumballs){
 11         soldOutState    = new SoldOutState(this);
 12         noQuarterState  = new NoQuarterState(this);
 13         hasQuarterState = new HasQuarterState(this);
 14         soldState       = new SoldState(this);
 15         
 16         this.count = numberGumballs;
 17         if(numberGumballs > 0){
 18             state = noQuarterState;
 19         }else{
 20             state = soldOutState;
 21         }
 22     }
 23     
 24     public void insertQuarter(){
 25         state.insertQuarter();
 26     }
 27     public void ejectQuarter(){
 28         state.ejectQuarter();
 29     }
 30     public void turnCrank(){
 31         state.turnCrank();
 32         state.dispense();
 33     }    
 34     void releaseBall(){
 35         System.out.println("A gumball comes rolling out of the slot");
 36         if(count != 0){
 37             count = count -1;
 38         }
 39     }
 40     //change state
 41     void setState(State state){
 42         this.state = state;
 43     }
 44     public State getState(){
 45         return this.state;
 46     }
 47     public State getSoldOutState(){
 48         return soldOutState;
 49     }
 50     public State getNoQuarterState(){
 51         return noQuarterState;
 52     }
 53     public State getHasQuarterStete(){
 54         return hasQuarterState;
 55     }
 56     public State getSoldState(){
 57         return soldState;
 58     }
 59     public int getCount(){
 60         return count;
 61     }
 62     void refill(int count){
 63         this.count += count;
 64         System.out.println("Refill: " + count);
 65         state.refill();        
 66     }
 67     public String toString(){
 68         StringBuffer result = new StringBuffer();
 69         result.append("\nInventory number: " + count + "\n");
 70         result.append("state: " + state + "\n");
 71         return result.toString();
 72     }
 73 }
 74 
 75 //State
 76 interface State{
 77     public void insertQuarter();
 78     public void ejectQuarter();
 79     public void turnCrank();
 80     public void dispense();
 81     public void refill();
 82 }
 83 
 84 class SoldOutState implements State{
 85     GumballMachine gumballMachine;
 86     public SoldOutState(GumballMachine gumballMachine){
 87         this.gumballMachine = gumballMachine;
 88     }
 89     public void insertQuarter(){
 90         System.out.println("can`n do it no gumball");
 91     }
 92     public void ejectQuarter(){
 93         System.out.println("can`n do it no gumball");
 94     }
 95     public void turnCrank(){
 96         System.out.println("can`n do it no gumball");
 97     }    
 98     public void dispense(){
 99         System.out.println("can`n do it no gumball");
100     }    
101     public String toString(){
102         return "sold out";
103     }
104     public void refill(){
105         gumballMachine.setState(gumballMachine.getNoQuarterState());
106     }
107 }
108 
109 class NoQuarterState implements State{
110     GumballMachine gumballMachine;
111     public NoQuarterState(GumballMachine gumballMachine){
112         this.gumballMachine = gumballMachine;
113     }
114     public void insertQuarter(){
115         System.out.println("You inserted a quarter");
116         gumballMachine.setState(gumballMachine.getHasQuarterStete());
117     }
118     public void ejectQuarter(){
119         System.out.println("You haven`t nserted a quarter");
120     }
121     public void turnCrank(){
122         System.out.println("there is no quarter");
123     }
124     public void dispense(){
125         System.out.println("You need to pay first");
126     }
127     public String toString(){
128         return "waiting for quarter";
129     }
130     public void refill(){}
131 }
132 
133 class HasQuarterState implements State{
134     GumballMachine gumballMachine;
135     public HasQuarterState(GumballMachine gumballMachine){
136         this.gumballMachine = gumballMachine;
137     }
138     public void insertQuarter(){
139         System.out.println("You can`t insert another quarter");
140     }
141     public void ejectQuarter(){
142         System.out.println("Quarter returned");
143         gumballMachine.setState(gumballMachine.getNoQuarterState());
144     }
145     public void turnCrank(){
146         System.out.println("your turn...");
147         gumballMachine.setState(gumballMachine.getSoldState());
148     }
149     public void dispense(){
150         System.out.println("No gumball dispense");
151     }
152     public String toString(){
153         return "waiting for turn of crank";
154     }
155     public void refill(){}
156 }
157 
158 class SoldState implements State{
159     GumballMachine gumballMachine;
160     public SoldState(GumballMachine gumballMachine){
161         this.gumballMachine = gumballMachine;
162     }
163     public void insertQuarter(){
164         System.out.println("can`n do it");
165     }
166     public void ejectQuarter(){
167         System.out.println("can`n do it");
168     }
169     public void turnCrank(){
170         System.out.println("can`n do it");
171     }    
172     public void dispense(){
173         gumballMachine.releaseBall();
174         if(gumballMachine.getCount()>0)
175             gumballMachine.setState(gumballMachine.getNoQuarterState());
176         else
177             gumballMachine.setState(gumballMachine.getSoldOutState());
178     }
179     public String toString(){
180         return "sold State";
181     }
182     public void refill(){}
183 }
184 
185 class gumballMachineTest{
186     public static void main(String[] args){
187         GumballMachine machine = new GumballMachine(2);
188         System.out.println(machine);
189         
190         System.out.println("1>");
191         machine.insertQuarter();
192         machine.turnCrank();
193         
194         System.out.println("\n2>");
195         machine.insertQuarter();
196         machine.turnCrank();
197         
198         System.out.println("\n3>");
199         machine.insertQuarter();
200         
201         System.out.println("\nRefill>");
202         machine.refill(3);
203         
204         System.out.println("\n4>");
205         machine.insertQuarter();
206         machine.turnCrank();
207     }
208 }

 3.其他:

Alaskan 在 State 前实现,函数Alaskan::nextState()的实现要放到State后面,在Alaskan类中仅声明该函数,可编过;

前置声明class State;后可以定义该类型指针,但实例化还不可。

posted @ 2020-04-20 16:08  三岁玩童  阅读(115)  评论(0编辑  收藏  举报