''' 状态模式(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类本身。 ################################################################################