状态模式包含以下主要角色:
1. 上下文(Context): 定义了客户端感兴趣的接口,同时维护一个具体状态的实例,并在状态切换时改变其行为。
2. 抽象状态类(State): 定义了一个接口,用于封装上下文的一个特定状态的行为。
3. 具体状态类(Concrete State): 实现了抽象状态接口,负责具体状态下的行为。
下面是一个简单的状态模式的例子,假设有一个电梯(上下文),可以根据不同的状态(停止、运行、开门、关门)来改变其行为:
# 上下文类:电梯
class ElevatorContext:
def __init__(self):
self._state = StoppedState(self)
def set_state(self, state):
self._state = state
def request_open_door(self):
self._state.open_door()
def request_close_door(self):
self._state.close_door()
def request_move(self):
self._state.move()
def request_stop(self):
self._state.stop()
# 抽象状态类
class State:
def __init__(self, context):
self._context = context
def open_door(self):
pass
def close_door(self):
pass
def move(self):
pass
def stop(self):
pass
# 具体状态类:停止状态
class StoppedState(State):
def open_door(self):
print("Opening the door")
self._context.set_state(OpeningDoorState(self._context))
def close_door(self):
print("The door is already closed")
def move(self):
print("Moving the elevator")
self._context.set_state(MovingState(self._context))
def stop(self):
print("The elevator is already stopped")
# 具体状态类:运行状态
class MovingState(State):
def open_door(self):
print("Cannot open the door while moving")
def close_door(self):
print("Cannot close the door while moving")
def move(self):
print("The elevator is already moving")
def stop(self):
print("Stopping the elevator")
self._context.set_state(StoppedState(self._context))
# 具体状态类:开门状态
class OpeningDoorState(State):
def open_door(self):
print("The door is already open")
def close_door(self):
print("Closing the door")
self._context.set_state(StoppedState(self._context))
def move(self):
print("Cannot move while opening the door")
def stop(self):
print("Cannot stop while opening the door")
# 客户端代码
if __name__ == "__main__":
# 创建电梯上下文
elevator = ElevatorContext()
# 操作电梯
elevator.request_move()
elevator.request_open_door()
elevator.request_close_door()
elevator.request_stop()
在上述示例中,ElevatorContext 是电梯上下文类,负责维护当前的状态,并提供接口供客户端操作。State 是抽象状态类,定义了不同状态下的行为。StoppedState、MovingState、OpeningDoorState 是具体状态类,分别表示停止状态、运行状态和开门状态。
客户端代码通过调用上下文的方法来操作电梯,上下文内部会根据当前状态调用相应状态类的方法。
状态模式的优点在于它将对象的状态切换行为封装在具体状态类中,使得状态之间的转换更加灵活。这种模式使得新增状态变得容易,并且使得状态切换逻辑更加清晰。
转载请注明出处:http://www.zyzy.cn/article/detail/11858/设计模式