-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstate.py
More file actions
159 lines (107 loc) · 3.36 KB
/
state.py
File metadata and controls
159 lines (107 loc) · 3.36 KB
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
from abc import ABC, abstractmethod
from math import floor
class State(ABC):
@abstractmethod
def insertDollar(self) -> None:
pass
@abstractmethod
def ejectMoney(self) -> None:
pass
@abstractmethod
def dispense(self) -> None:
pass
class VendingMachine(ABC):
@abstractmethod
def setState(self) -> None:
pass
@abstractmethod
def getCount(self) -> int:
pass
@abstractmethod
def insertDollar(self) -> None:
pass
@abstractmethod
def ejectMoney(self) -> None:
pass
@abstractmethod
def dispense(self) -> None:
pass
@abstractmethod
def getOutOfStockState(self) -> State:
pass
@abstractmethod
def getHasOneDollarState(self) -> State:
pass
@abstractmethod
def getIdleState(self) -> State:
pass
@abstractmethod
def doReleaseProduct(self) -> State:
pass
class IdleState(State):
def insertDollar(self, vm: VendingMachine) -> None:
print("dollar inserted")
vm.setState(vm.getHasOneDollarState())
def ejectMoney(self, vm: VendingMachine) -> None:
print("no money to return")
def dispense(self, vm: VendingMachine) -> None:
print("payment required")
class HasOneDollarState(State):
def insertDollar(self, vm: VendingMachine) -> None:
print("already have one dollar")
def ejectMoney(self, vm: VendingMachine) -> None:
print("returning money")
vm.doReturnMoney()
vm.setState(vm.getIdleState())
def dispense(self, vm: VendingMachine) -> None:
print("releasing product")
if vm.getCount() > 1:
vm.doReleaseProduct()
vm.setState(vm.getIdleState())
else:
vm.doReleaseProduct()
vm.setState(vm.getOutOfStockState())
class OutOfStockState(State):
def insertDollar(self, vm: VendingMachine) -> None:
print("Out Of Stock")
vm.doReturnMoney()
def ejectMoney(self, vm: VendingMachine) -> None:
print("no money to return")
def dispense(self, vm: VendingMachine) -> None:
print("Out Of Stock")
class PopMachine(VendingMachine):
def __init__(self, count) -> None:
self.idleState = IdleState()
self.hasOneDollarState = HasOneDollarState()
self.outOfStockState = OutOfStockState()
self.count = count
if self.count > 0:
self.currentState = self.idleState
else:
self.currentState = self.outOfStockState
def getCount(self) -> int:
return self.count
def insertDollar(self) -> None:
self.currentState.insertDollar(self)
def ejectMoney(self) -> None:
self.currentState.ejectMoney(self)
def dispense(self) -> None:
self.currentState.dispense(self)
def getOutOfStockState(self) -> State:
return self.outOfStockState
def getHasOneDollarState(self) -> State:
return self.hasOneDollarState
def getIdleState(self) -> State:
return self.idleState
def doReleaseProduct(self) -> State:
self.count -= 1
def setState(self, state: State) -> None:
self.currentState = state
print("Current State => ", self.currentState.__class__.__name__)
def doReturnMoney(self):
print("here is your Dollar Back")
vm = PopMachine(2)
vm.insertDollar()
vm.dispense()
vm.insertDollar()
vm.ejectMoney()