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