public class StatusTest {
public int a;
public int b;
public int c;
public int d;
}
class A extends StatusTest{}
class B extends StatusTest{}
class C extends StatusTest{}
class D extends StatusTest{}
public int a;
public int b;
public int c;
public int d;
}
class A extends StatusTest{}
class B extends StatusTest{}
class C extends StatusTest{}
class D extends StatusTest{}
2. public interface State {
3. public void insertQuarter();
4. public void ejectQuarter();
5. public void turnCrank();
6. public void dispense();
7. }
8. //实现我们的状态类
9. public class NoQuarterState implements State { //先实现State接口
10. GumballMachine gumballMachine;
11. //通过构造器得到糖果机的引用
12. public NoQuarterState(GumballMachine gumballMachine) {
13. this.gumballMachine = gumballMachine;
14. }
15. //还是那几个方法
16. public void insertQuarter() {
17. System.out.println("You inserted a quarter");
18. //你马上会看到这里如何工作的
19. gumballMachine.setState(gumballMachine.getHasQuarterState());
20. }
21. public void ejectQuarter() {
22. System.out.println("You haven't inserted a quarter");
23. }
24. public void turnCrank() {
25. System.out.println("You turned, but there's no quarter");
26. }
27. public void dispense() {
28. System.out.println("You need to pay first");
29. }
30. public String toString() {
31. return "waiting for quarter";
32. }
33. }
34. //完整的糖果机类
35. public class GumballMachine {
36. //所有的状态都在这里
37. State soldOutState;
38. State noQuarterState;
39. State hasQuarterState;
40. State soldState;
41. State winnerState;//十次抽中一次的游戏,新的状态
42. //以及实例变量state
43. State state = soldOutState;
44. int count = 0;//记录糖果数量
45. public GumballMachine(int numberGumballs) {
46. soldOutState = new SoldOutState(this); //每一种状态也都创建一个状态实例
47. noQuarterState = new NoQuarterState(this);
48. hasQuarterState = new HasQuarterState(this);
49. soldState = new SoldState(this);
50. this.count = numberGumballs;
51. if (numberGumballs > 0) { //如果超过0颗糖果,状态设为noQuarterState
52. state = noQuarterState;
53. }
54. }
55. //委托给当前状态
56. public void insertQuarter() {
57. state.insertQuarter();
58. }
59. public void ejectQuarter() {
60. state.ejectQuarter();
61. }
62. //dispense()是一个内部动作方法,用户不可以直接要求机器发放糖果
63. public void turnCrank() {
64. state.turnCrank();
65. state.dispense();
66. }
67. //允许其他的对象将机器状态转换到不同的状态
68. void setState(State state) {
69. this.state = state;
70. }
71. //辅助方法释放出糖果,并将count实例变量值减1
72. void releaseBall() {
73. System.out.println("A gumball comes rolling out the slot...");
74. if (count != 0) {
75. count = count - 1;
76. }
77. }
78. int getCount() {
79. return count;
80. }
81. void refill(int count) {
82. this.count = count;
83. state = noQuarterState;
84. }
85. public State getState() {return state;}
86. public State getSoldOutState() {return soldOutState;}
87. public State getNoQuarterState() {return noQuarterState;}
88. public State getHasQuarterState() {return hasQuarterState;}
89. public State getSoldState() {return soldState;}
90. public State getWinnerState() {return winnerState;}
91. }
92. //现在我们来实现HasQuarterState(有25分钱)和SoldState(售出糖果)方法,糖果售完的方法自己写写,这里就不提供了
93. public class HasQuarterState implements State {
94. GumballMachine gumballMachine;
95. //增加一个随机数产生器,产生10%的机会
96. Random randomWinner = new Random(System.currentTimeMillis());
97. public HasQuarterState(GumballMachine gumballMachine) {
98. this.gumballMachine = gumballMachine;
99. }
100. public void insertQuarter() { //这是一个对当前状态不恰当的动作
101. System.out.println("You can't insert another quarter");
102. }
103. public void ejectQuarter() { //退钱并转换状态到NoQuarterState
104. System.out.println("Quarter returned");
105. gumballMachine.setState(gumballMachine.getNoQuarterState());
106. }
107. public void turnCrank() {
108. System.out.println("You turned...");
109. int winner = randomWinner.nextInt(10);
110. //决定这个顾客是否赢了
111. if ((winner == 0) && (gumballMachine.getCount() > 1)) {
112. gumballMachine.setState(gumballMachine.getWinnerState());
113. } else {
114. gumballMachine.setState(gumballMachine.getSoldState());
115. }
116. }
117. public void dispense() { //这是一个对当前状态不恰当的动作
118. System.out.println("No gumball dispensed");
119. }
120. }
121. public class SoldState implements State {
122. GumballMachine gumballMachine;
123. public SoldState(GumballMachine gumballMachine) {
124. this.gumballMachine = gumballMachine;
125. }
126. //以下3个方法对此状态来说都是不恰当的
127. public void insertQuarter() {
128. System.out.println("Please wait, we're already giving you a gumball");
129. }
130. public void ejectQuarter() {
131. System.out.println("Sorry, you already turned the crank");
132. }
133. public void turnCrank() {
134. System.out.println("Turning twice doesn't get you another gumball!");
135. }
136. //首先让机器发放糖果
137. public void dispense() {
138. gumballMachine.releaseBall();
139. if (gumballMachine.getCount() > 0) {
140. gumballMachine.setState(gumballMachine.getNoQuarterState());
141. } else {
142. System.out.println("Oops, out of gumballs!");
143. gumballMachine.setState(gumballMachine.getSoldOutState());
144. }
145. }
146. }
147. //我们再来实现WinnerState类
148. public class WinnerState implements State {
149. GumballMachine gumballMachine;
150. //下面都跟SoldState方法一样
151. public WinnerState(GumballMachine gumballMachine) {
152. this.gumballMachine = gumballMachine;
153. }
154. public void insertQuarter() {
155. System.out.println("Please wait, we're already giving you a Gumball");
156. }
157. public void ejectQuarter() {
158. System.out.println("Please wait, we're already giving you a Gumball");
159. }
160. public void turnCrank() {
161. System.out.println("Turning again doesn't get you another gumball!");
162. }
163. //我们在这里发放出2颗糖果,然后进入NoQuarterState或SoldState
164. public void dispense() {
165. System.out.println("YOU'RE A WINNER! You get two gumballs for your quarter");
166. gumballMachine.releaseBall();
167. if (gumballMachine.getCount() == 0) {
168. gumballMachine.setState(gumballMachine.getSoldOutState());
169. } else {
170. gumballMachine.releaseBall();
171. if (gumballMachine.getCount() > 0) {
172. gumballMachine.setState(gumballMachine.getNoQuarterState());
173. } else {
174. System.out.println("Oops, out of gumballs!");
175. gumballMachine.setState(gumballMachine.getSoldOutState());
176. }
177. }
178. }
179. }
insertQuarter();
ejectQuarter();
turnCrank();
dispense(); 都是动作不是状态,另外状态应该封装在一个context中