-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathState.py
118 lines (87 loc) · 2.89 KB
/
State.py
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
from abc import ABC, abstractmethod
class Elevator:
"""
The Elevator class is the context. It should be initiated with a default state.
"""
_state = None
def __init__(self, state: "State") -> None:
self.setElevator(state)
def setElevator(self, state: "State"):
"""
Method to change the state of the object
"""
self._state = state
self._state.elevator = self
def presentState(self):
print(f"Elevator is in {type(self._state).__name__}\n")
# The methods for executing the elevator functionality. These depends on the current state of the object.
def pushDownButton(self):
self._state.pushDownButton()
def pushUpButton(self):
self._state.pushUpButton()
class State(ABC):
"""
The common State interface for all the states
"""
_elevator = None
@property
def elevator(self) -> Elevator:
return self._elevator
@elevator.setter
def elevator(self, elevator: Elevator) -> None:
self._elevator = elevator
@abstractmethod
def pushDownButton(self) -> None:
pass
@abstractmethod
def pushUpButton(self) -> None:
pass
# The concrete states
class FirstFloor(State):
def pushDownButton(self) -> None:
"""
If the down button is pushed when it is already on the first floor, nothing should happen
"""
print("Already in the bottom floor!")
def pushUpButton(self) -> None:
"""
If up button is pushed, move upwards then it changes its state to second floor.
"""
print("Elevator moving upward one floor...")
self.elevator.setElevator(SecondFloor())
class SecondFloor(State):
def pushDownButton(self) -> None:
"""
If down button is pushed it should move one floor down
"""
print("Elevator moving down a floor...")
self.elevator.setElevator(FirstFloor())
def pushUpButton(self) -> None:
"""
If up button is pushed, move upwards then it changes its state to third floor.
"""
print("Elevator moving upward one floor...")
self.elevator.setElevator(ThirdFloor())
class ThirdFloor(State):
def pushDownButton(self) -> None:
"""
If down button is pushed it should move one floor down
"""
print("Elevator moving down a floor...")
self.elevator.setElevator(SecondFloor())
def pushUpButton(self) -> None:
"""
If up button is pushed nothing should happen
"""
print("Already in the top floor!")
if __name__ == "__main__":
# The client code
myElevator = Elevator(FirstFloor())
myElevator.presentState()
# Up button is pushed twice
myElevator.pushUpButton()
myElevator.pushUpButton()
myElevator.presentState()
# Down button is pushed
myElevator.pushDownButton()
myElevator.presentState()