'''
中介者模式（Mediator Pattern）是一种行为型设计模式，它定义了一个中介对象来封装一系列对象之间的交互。
中介者使各对象不需要显式地相互引用，从而使其耦合松散，而且可以独立地改变它们之间的交互。

设想书店管理系统，其中包含了多个组件，比如库存管理、订单处理、顾客管理等。
这些组件之间需要相互通信来协同工作。我们可以使用中介者模式来减少这些组件之间的直接依赖。

在这个示例中，BookstoreMediator 充当了中介者的角色，它协调了库存管理、订单处理和顾客管理之间的交互。
当某个事件发生时（比如顾客下订单），相应的组件会通过中介者发送通知，中介者再根据事件类型协调其他组件的响应。
'''

from abc import ABC, abstractmethod  

#定义一个中介者接口和具体的中介者实现
  
# 中介者接口  
class Mediator(ABC):  
    @abstractmethod  
    def notify(self, sender, event):  
        pass  
  
# 具体的中介者实现  
class BookstoreMediator(Mediator):  
    def __init__(self, inventory, order, customer):  
        self.inventory = inventory  
        self.order = order  
        self.customer = customer  
  
    def notify(self, sender, event):  
        if event == 'book_ordered':  
            print("BookstoreMediator: Order notification received. Checking inventory...")  
            if self.inventory.has_stock():  
                print("BookstoreMediator: Inventory has stock. Processing order...")  
                self.order.process_order()  
                self.customer.notify_order_success()  
            else:  
                print("BookstoreMediator: Inventory out of stock. Cancelling order...")  
                self.order.cancel_order()  
                self.customer.notify_order_failure()  
        # 可以添加更多的事件处理逻辑  
  
# 库存管理组件  
class Inventory:  
    def has_stock(self):  
        # 这里简化逻辑，直接返回有库存  
        return True  
  
# 订单处理组件  
class Order:  
    def process_order(self):  
        print("Order: Order is being processed...")  
  
    def cancel_order(self):  
        print("Order: Order is being cancelled...")  
  
# 顾客管理组件  
class Customer:  
    def notify_order_success(self):  
        print("Customer: Order successful. Notifying customer...")  
  
    def notify_order_failure(self):  
        print("Customer: Order failed. Notifying customer...")  
  
# 组件之间的交互通过中介者进行  
class BookstoreComponent:  
    def __init__(self, mediator):  
        self.mediator = mediator  
  
    def send_notification(self, event):  
        self.mediator.notify(self, event)  
  
# 示例使用  
if __name__ == "__main__":  
    # 创建组件  
    inventory = Inventory()  
    order = Order()  
    customer = Customer()  
  
    # 创建中介者并注入组件  
    mediator = BookstoreMediator(inventory, order, customer)  
  
    # 创建与中介者关联的书店组件（这里以订单为例）  
    order_component = BookstoreComponent(mediator)  
  
    # 触发事件（比如：下订单）  
    order_component.send_notification('book_ordered')