You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
# 观察者模式允许一个对象(观察者)监听另一个对象(主题)的状态变化,并在状态变化时得到通知。
|
|
|
|
|
# 主类信息发生变化,通知登记的各个对象(把自己当当参数传过去)自行处理变化
|
|
|
|
|
# 当购物车中的商品数量发生变化时,库存系统和价格计算系统需要实时更新。
|
|
|
|
|
# 观察者模式(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) # 当添加商品时,库存系统和价格计算器都会收到更新通知
|