zoukankan      html  css  js  c++  java
  • python设计模式之观察者模式

    观察者模式

     当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

     观察者模式在状态检测和事件处理等场景中是非常有用的。这种模式确保一个核心对象可以由一组未知并可能正在扩展的“观察者”对象来监控。一旦核心对象的某个值发生变化,它通过调用update()函数让所有观察者对象知道情况发生了变化。各个观察者在核心对象发生变化时,有可能会负责处理不同的任务;核心对象不知道也不关心这些任务是什么,通常观察者也同样不知道,不关心其他的观察者正在做什么。

    class Inventory:
        """docstring for ClassName"""
        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:
                    """docstring for ConsoleObserver"""
                    def __init__(self, Inventory):
                        self.Inventory=Inventory
                    def __call__(self):
                        print(self.Inventory.product)
                        print(self.Inventory.quantity)    
                                    
    
                
    >>> import ObserverPatternDemo
    >>> i=ObserverPatternDemo.Inventory()
    >>> c=ObserverPatternDemo.ConsoleObserver(i)
    >>> i.attach(c)
    >>> i.product="Hello world!"
    Hello world!
    0
    >>> i.quantity=999
    Hello world!
    999

    这个对象两个属性,对其执行赋值,便调用_update_observers方法。该方法所做的工作就是对所有可用的观察者进行遍历,好让他们知道发生了一些变化。这里直接调用__call__函数来处理变化。这在其他许多编程语言是不能的,在python中是一种让我们代码可读性的一种捷径。

  • 相关阅读:
    Apache配置虚拟主机的三种方法(基于IP、端口、域名)
    shell中嵌套执行expect命令实例(利用expect实现自动登录)
    Shell脚本实现SSH免密登录及批量配置管理
    搭建本地yum源服务器
    awk之腾迅面试题1
    16个tomcat面试题
    tomcat常见面试题1
    Mysql经典面试题
    10个超有趣的linux命令
    Codeforces Beta Round #79 (Div. 2 Only)
  • 原文地址:https://www.cnblogs.com/SamllBaby/p/5428050.html
Copyright © 2011-2022 走看看