'''
职责链模式（Chain of Responsibility Pattern）

一种行为设计模式，它允许你将请求沿着处理者链进行发送。
收到请求后，每个处理者均可对请求进行处理，或将其传递给链上的下个处理者。

在书城的业务背景中，可以想象有这样的场景：
客户下了一个订单，该订单需要经历多个处理步骤，比如验证库存、计算价格、生成发货通知等。
这些处理步骤按照一定的顺序组织成一个处理链
'''

class Order:  
    def __init__(self, book_id, quantity):  
        self.book_id = book_id  
        self.quantity = quantity  
  
  
class Handler:  
    def __init__(self, successor=None):  
        self.successor = successor  
  
    def handle_request(self, order):  
        raise NotImplementedError("Subclasses must implement handle_request()")  
  
    def successor_handle_request(self, order):  
        if self.successor is not None:  
            return self.successor.handle_request(order)  
  
  
class InventoryHandler(Handler):  
    def handle_request(self, order):  
        if check_inventory(order.book_id, order.quantity):  
            print("InventoryHandler: Inventory checked, enough stock.")  
            return self.successor_handle_request(order)  
        else:  
            print("InventoryHandler: Inventory check failed, not enough stock.")  
            return False  
  
  
class PricingHandler(Handler):  
    def handle_request(self, order):  
        price = calculate_price(order.book_id, order.quantity)  
        print(f"PricingHandler: Price calculated, total: {price}")  
        return self.successor_handle_request(order)  
  
  
class NotificationHandler(Handler):  
    def handle_request(self, order):  
        send_notification(order)  
        print("NotificationHandler: Notification sent to customer.")  
        # Since this is the end of the chain, no successor to call.  
        return True  
  
  
# Dummy functions to simulate the bookstore logic  
def check_inventory(book_id, quantity):  
    return True  # Simulate enough stock  
  
  
def calculate_price(book_id, quantity):  
    return 10.0 * quantity  # Simulate a fixed price per book  
  
  
def send_notification(order):  
    pass  # Simulate sending a notification to the customer  
  
  
# Setting up the Chain of Responsibility  
inventory_handler = InventoryHandler()  
pricing_handler = PricingHandler()  
notification_handler = NotificationHandler()  
  
inventory_handler.successor = pricing_handler  
pricing_handler.successor = notification_handler  
  
# Client code  
order = Order(book_id="12345", quantity=2)  
result = inventory_handler.handle_request(order)  
if result:  
    print("Order processing completed successfully.")  
else:  
    print("Order processing failed.")

'''
在这个例子中，我们有一个Handler基类，它定义了一个处理请求的基本框架。
具体的处理逻辑则在子类InventoryHandler、PricingHandler和NotificationHandler中实现。
这些子类形成了职责链，通过successor引用链接在一起。

客户下了一个订单后，这个订单请求会从库存处理器（InventoryHandler）开始处理。
如果库存足够，请求将被传递给价格处理器（PricingHandler）来计算总价。
然后，价格处理器再将请求传递给通知处理器（NotificationHandler），
最后发送通知给客户。
如果任何处理器无法处理请求（例如，库存不足），处理将在那里终止，并且返回相应的结果。

这个模式的好处是可以很容易地改变处理的顺序或者增加/删除处理器，而不需要修改已有的代码。
'''    