zoukankan      html  css  js  c++  java
  • 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他们的情报(狗头)

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

  • 相关阅读:
    springboot2 整合redis
    springboot2 整合mongodb
    Springboot2 Vue 前后端分离 整合打包 docker镜像
    nginx常见问题总结
    nginx配置中root和alias的区别
    nginx高级用法
    nginx搭建代理服务器与负载均衡器
    nginx常规扩展功能
    nginx典型官方模块解释
    nginx默认配置文件解释
  • 原文地址:https://www.cnblogs.com/buzhouke/p/14258827.html
Copyright © 2011-2022 走看看