# 观察者模式允许一个对象（观察者）监听另一个对象（主题）的状态变化，并在状态变化时得到通知。
# 主类信息发生变化，通知登记的各个对象（把自己当当参数传过去）自行处理变化
# 当购物车中的商品数量发生变化时，库存系统和价格计算系统需要实时更新。
# 观察者模式（Observer）或发布-订阅模式（Publish-Subscribe）

import abc

class Observer(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def update(self, cart):
        pass

class InventorySystem(Observer):
    def update(self, cart):
        # 更新库存逻辑...
        pass

class PriceCalculator(Observer):
    def update(self, cart):
        # 重新计算总价逻辑...
        pass

class ShoppingCart:
    def __init__(self):
        self._items = {}
        self.observers = []

    def add_item(self, item_id, quantity):
        # 添加商品到购物车并通知所有观察者
        self._items[item_id] = quantity
        for observer in self.observers:
            observer.update(self)

    def attach(self, observer):
        self.observers.append(observer)

# 创建购物车并添加观察者
cart = ShoppingCart()
inventory_system = InventorySystem()
price_calculator = PriceCalculator()

cart.attach(inventory_system)
cart.attach(price_calculator)

cart.add_item('item1', 2)  # 当添加商品时，库存系统和价格计算器都会收到更新通知