python 观察者模式
python 观察者模式
前言
emm写的仓促就不截UML类图了,书本Chapter10,P313能看到图
代码
一旦观察的主题有更新,就会通知到观察者们,下面的例子是最简单的一个观察者范例,假设这是一群投机分子密切关注(军 火)仓库的产品与数量变动
class Inventory:
def __init__(self):
self.observers = []
self._product = None
self._quantity = 0
def attach(self, observer):
self.observers.append(observer)
@property
def product(self):
return self._product
@product.setter
def product(self, value):
self._product = value
self._update_observers()
@property
def quantity(self):
return self._quantity
@quantity.setter
def quantity(self, value):
self._quantity = value
self._update_observers()
def _update_observers(self):
for observer in self.observers:
observer()
class ConsoleObserver:
def __init__(self, inventory, name):
self.inventory = inventory
self.name = name
def __call__(self):
print(self.name, " ", self.inventory.product)
print(self.name, " ", self.inventory.quantity)
if __name__ == "__main__":
i = Inventory()
c = ConsoleObserver(i, "c1")
i.attach(c)
c2 = ConsoleObserver(i, "c2")
i.attach(c2)
i.quantity = "Gun"
i.quantity = 7
这里稍微修改了下书本的代码,让我们能更清晰的看到是哪个观察者收到的通知。
关键点在于Callable函数,其将ConsoleObserver变成一个可以调用的函数,于是我们一更新仓库的动静(调用set方法),就会触发_update_observers,因此投机分子收到消息然后print他们的情报(狗头)
复习再紧张也不能忘记制造有趣