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

这里稍微修改了下书本的代码,让我们能更清晰的看到是哪个观察者收到的通知。

image-20210110170644188

关键点在于Callable函数,其将ConsoleObserver变成一个可以调用的函数,于是我们一更新仓库的动静(调用set方法),就会触发_update_observers,因此投机分子收到消息然后print他们的情报(狗头)

复习再紧张也不能忘记制造有趣

posted @ 2021-01-10 17:10  不周客  阅读(97)  评论(0编辑  收藏  举报