/
VendingMachine.java
132 lines (121 loc) · 3.7 KB
/
VendingMachine.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package com.example.jingbin.designpattern.state.old;
import android.util.Log;
/**
* Created by jingbin on 2016/11/2.
* 自动售货机
* 分析一个这个状态图:
* a、包含4个状态(我们使用4个int型常量来表示)
* b、包含3个暴露在外的方法(投币、退币、转动手柄)
* c、我们需要处理每个状态下,用户都可以触发这三个动作。
*/
public class VendingMachine {
/**
* 已投币
*/
private final static int HAS_MONEY = 0;
/**
* 未投币
*/
private final static int NO_MONEY = 1;
/**
* 售出商品
*/
private final static int SOLD = 2;
/**
* 商品售罄
*/
private final static int SOLD_OUT = 3;
private int currentStatus = NO_MONEY;
/**
* 商品数量
*/
private int count = 0;
public VendingMachine(int count) {
this.count = count;
if (count > 0) {
currentStatus = NO_MONEY;
}
}
/**
* 投入硬币,任何状态用户都可能投币
*/
public void insertMoney() {
switch (currentStatus) {
case NO_MONEY://未投币
currentStatus = HAS_MONEY;
Log.e("insertMoney", "---成功投入硬币");
break;
case HAS_MONEY://已投币
Log.e("insertMoney", "---已经有硬币,无需投币");
break;
case SOLD://售出商品
Log.e("insertMoney", "---请稍等...");
break;
case SOLD_OUT://商品售罄
Log.e("insertMoney", "---商品已经售罄, 请勿投币");
break;
}
}
/**
* 退币,任何状态用户都可能退币
*/
public void backMoney() {
switch (currentStatus) {
case NO_MONEY://未投币
Log.e("backMoney", "---您未投入硬币");
break;
case HAS_MONEY://已投币
currentStatus = NO_MONEY;
Log.e("backMoney", "---退币成功");
break;
case SOLD://售出商品
Log.e("backMoney", "---您已经买了糖果...");
break;
case SOLD_OUT://商品售罄
Log.e("backMoney", "---您未投币,想坑我钱吗?");
break;
}
}
/**
* 转动手柄购买,任何状态都有可能转动手柄
*/
public void turnCrank() {
switch (currentStatus) {
case NO_MONEY://未投币
Log.e("turnCrank", "---请先投入硬币");
break;
case HAS_MONEY://已投币
Log.e("turnCrank", "---正在出商品");
currentStatus = SOLD;
dispense();
break;
case SOLD://售出商品
Log.e("turnCrank", "---连续转动也没用...");
break;
case SOLD_OUT://商品售罄
Log.e("turnCrank", "---商品已经售罄");
break;
}
}
/**
* 发送商品
*/
private void dispense() {
switch (currentStatus) {
case NO_MONEY://未投币
case HAS_MONEY://已投币
case SOLD_OUT://商品售罄
throw new IllegalStateException("非法的状态...");
case SOLD://售出商品
count--;
Log.e("dispense", "---发出商品...");
if (count == 0) {
Log.e("dispense", "---商品售罄");
currentStatus = SOLD_OUT;
} else {
currentStatus = NO_MONEY;
}
break;
}
}
}