2018-02-11-python状态机设计模式

python demo

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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# -*- coding: utf-8 -*-
'''状态机设计模式-demo'''
import random


class Machine(object):
'''糖果机类'''

def __init__(self, num):
self.num = num
self.set_state('no_coin')

def set_state(self, state):
if self.num <= 0:
self.state = 'sold_out'
else:
self.state = state

def get_state(self):
if self.state == 'coin_in':
return CoinInState(self)

if self.state == 'no_coin':
return NoCoinState(self)

if self.state == 'sold':
return SoldState(self)

if self.state == 'winner':
return WinnerState(self)

return SoldOutState(self)

def sub(self):
if self.num > 0:
self.num -= 1

def coin_in(self):
self.get_state().coin_in()

def coin_out(self):
self.get_state().coin_out()

def turn(self):
self.get_state().turn()

def out(self):
self.get_state().out()


class State(object):
'''状态基类'''

def coin_in(self):
raise NotImplementedError

def coin_out(self):
raise NotImplementedError

def turn(self):
raise NotImplementedError


class NoCoinState(State):
def __init__(self, machine):
self.machine = machine

def coin_in(self):
print('你投入了5元')
self.machine.set_state('coin_in')

def coin_out(self):
print('您还没有投币,不能退币,想多了吧?')

def turn(self):
print('您还没有投币,不能转动手柄,想多了吧?')


class CoinInState(State):
def __init__(self, machine):
self.machine = machine

def coin_in(self):
print('您已经投入了5元,无需再次投入')

def coin_out(self):
print('ok,马上退回您的5元')
self.machine.set_state('no_coin')

def turn(self):
print('ok, 稍等片刻,马上给您饮料')
winner = random.randint(1, 10)
if winner == 1:
self.machine.set_state('winner')
else:
self.machine.set_state('sold')


class SoldState(State):
def __init__(self, machine):
self.machine = machine

def coin_in(self):
print('您已经投了5元,不要再投了')

def coin_out(self):
print('已经转动了手柄,不能再退回钱了')

def turn(self):
print('别着急,您已经转动了手柄,请稍等片刻取走您的商品')

def out(self):
'''售卖机内部动作,无需手动调用,由售卖机自动调用'''
self.machine.sub()
self.machine.set_state('no_coin')


class SoldOutState(State):
def __init__(self, machine):
self.machine = machine

def coin_in(self):
print("所有商品已售完")

def coin_out(self):
print("所有商品已售完")

def turn(self):
print("所有商品已售完")

def out(self):
print("所有商品已售完")


class WinnerState(State):
def __init__(self, machine):
self.machine = machine

def coin_in(self):
print('您已经投了5元,不要再投了')

def coin_out(self):
print('已经转动了手柄,不能再退回钱了')

def turn(self):
print('别着急,您已经转动了手柄,请稍等片刻取走您的商品')

def out(self):
print('中奖了,多赠送一个')
self.machine.sub()
if self.machine.num > 0:
self.machine.sub()
else:
print('悲哀,库存不存,只能白中奖了')
self.machine.set_state('no_coin')


if __name__ == '__main__':
machine = Machine(10)
for i in range(10):
machine.coin_in()
machine.turn()
machine.out()