# -*- coding: utf-8 -*-
### 状态模式:
"""
- 定义:
当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类
- 优点:
1. 状态模式下,结构清晰,相比于 if...else更简洁
2. 封装性好,外部结构不必知道内部细节
3. 应用场景:行为状态改变的场景. 在各种控制器中非常常见 或 逻辑结构为状态转移图的场景
- 缺点:
1. 在状态较多时,子类不便管理
"""
class LiftState:
"""
# 电梯状态
"""
def open(self):
pass
def close(self):
pass
def run(self):
pass
def stop(self):
pass
class OpenState(LiftState):
def open(self):
print('Open:门已开启!')
return self
def close(self):
print('Open:开始关门!')
print('Open:已经关门')
return StopState()
def run(self):
print('Open: 禁止运行!')
return self
def stop(self):
print('Open: 禁止停止!')
return self
class RunState(LiftState):
def open(self):
print('RUN:禁止开门!')
return self
def close(self):
print('RUN:禁止关闭')
return self
def run(self):
print('RUN:电梯正在运行')
return self
def stop(self):
print('RUN:即将停止!')
print('RUN:已经停止!')
return StopState()
class StopState(LiftState):
def open(self):
print('Stop:门即将打开')
print('Stop:门已打开')
return OpenState()
def close(self):
print('Stop:禁止关门!')
return self
def run(self):
print('Stop:电梯开始运行!')
return RunState()
def stop(self):
print('Stop: 电梯已经停止')
return self
class Context():
lift_state = ''
def getState(self):
"""
# 获取状态
:return:
"""
return self.lift_state
def setState(self, lift_state):
"""
# 设置 电梯状态
:param lift_state:
:return:
"""
self.lift_state = lift_state
def open(self):
"""
# 开门
:return:
"""
self.setState(self.lift_state.open())
def close(self):
"""
# 关门
:return:
"""
self.setState(self.lift_state.close())
def run(self):
"""
# 运行
:return:
"""
self.setState(self.lift_state.run())
def stop(self):
"""
# 停止
:return:
"""
self.setState(self.lift_state.stop())
if __name__ == '__main__':
ctx = Context()
ctx.setState(StopState())
ctx.open()
ctx.run()
ctx.close()
ctx.run()
ctx.stop()