|
|
|
|
'''
|
|
|
|
|
状态模式(State Pattern)允许一个对象在其内部状态改变时改变它的行为。
|
|
|
|
|
这个模式将状态封装成独立的类,并将状态转换的逻辑分散到这些类中,从而减少相互间的依赖。
|
|
|
|
|
以下是一个使用状态模式的简单示例,我们将创建一个订单类Order,它有几个状态:
|
|
|
|
|
Placed(已下单)、Paid(已支付)、Fulfilled(已履行)和Delivered(已交付)。
|
|
|
|
|
每个状态都是一个类,它们继承自一个抽象状态类OrderState。
|
|
|
|
|
'''
|
|
|
|
|
################################################################################
|
|
|
|
|
# 定义抽象状态类和一些具体的状态类
|
|
|
|
|
################################################################################
|
|
|
|
|
class OrderState:
|
|
|
|
|
def handle(self, order):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class PlacedState(OrderState):
|
|
|
|
|
def handle(self, order):
|
|
|
|
|
print("Order placed. Waiting for payment...")
|
|
|
|
|
order.set_state(order.get_paid_state())
|
|
|
|
|
|
|
|
|
|
class PaidState(OrderState):
|
|
|
|
|
def handle(self, order):
|
|
|
|
|
print("Order paid. Preparing for fulfillment...")
|
|
|
|
|
order.set_state(order.get_fulfilled_state())
|
|
|
|
|
|
|
|
|
|
class FulfilledState(OrderState):
|
|
|
|
|
def handle(self, order):
|
|
|
|
|
print("Order fulfilled. Preparing for delivery...")
|
|
|
|
|
order.set_state(order.get_delivered_state())
|
|
|
|
|
|
|
|
|
|
class DeliveredState(OrderState):
|
|
|
|
|
def handle(self, order):
|
|
|
|
|
print("Order delivered. Process completed.")
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 定义Order类,它包含一个对当前状态的引用,并且能够通过set_state方法改变其状态
|
|
|
|
|
################################################################################
|
|
|
|
|
class Order:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self._state = None
|
|
|
|
|
self.set_state(self.get_placed_state())
|
|
|
|
|
|
|
|
|
|
def set_state(self, state):
|
|
|
|
|
self._state = state
|
|
|
|
|
|
|
|
|
|
def get_state(self):
|
|
|
|
|
return self._state
|
|
|
|
|
|
|
|
|
|
def get_placed_state(self):
|
|
|
|
|
return PlacedState()
|
|
|
|
|
|
|
|
|
|
def get_paid_state(self):
|
|
|
|
|
return PaidState()
|
|
|
|
|
|
|
|
|
|
def get_fulfilled_state(self):
|
|
|
|
|
return FulfilledState()
|
|
|
|
|
|
|
|
|
|
def get_delivered_state(self):
|
|
|
|
|
return DeliveredState()
|
|
|
|
|
|
|
|
|
|
def process(self):
|
|
|
|
|
self._state.handle(self)
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 创建一个Order对象并模拟其状态转换
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
order = Order()
|
|
|
|
|
|
|
|
|
|
# 模拟订单处理流程
|
|
|
|
|
order.process() # 初始状态为Placed,执行后将变为Paid
|
|
|
|
|
order.process() # 当前状态为Paid,执行后将变为Fulfilled
|
|
|
|
|
order.process() # 当前状态为Fulfilled,执行后将变为Delivered
|
|
|
|
|
order.process() # 当前状态为Delivered,执行后不会改变,因为Delivered是最终状态
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 这个例子中,每个状态类都负责决定下一个状态是什么,并在handle方法中触发状态转换。
|
|
|
|
|
# Order类不直接知道所有可能的状态转换,这些逻辑被封装在状态类中。
|
|
|
|
|
# 这使得添加新的状态或修改现有状态的行为变得更加容易,因为不需要修改Order类本身。
|
|
|
|
|
################################################################################
|