观察者模式

150 阅读1分钟

适用场景

观察者模式类似于Qt里面的信号与槽的关系,被观察对象发出信号,不同的观察者做不同的处理,这样就将信号发出的代码与信号处理的代码分离,而且方便扩展不同的观察者。比如,将数据备份在不同的数据库和文件里。

UML

classDiagram
class Core{
+attach(observer)
+get()
+set()
}
class ObserverInterface{
+__call__()
}

ObserverInterface <|.. Observer1
ObserverInterface <|.. Observer2

Core *-- ObserverInterface

为了能够通知观察者,被观察者需要保存观察者实例,而所有的观察者需要实现同一接口。

python 代码示例:

# 被观察者对象
class Inventory:
    def __init__(self):
        self.observers = []
        self._product = None
    
    def attach(observer):
        self.observers.append(observer)
        
    @property
    def product(self):
        return self._product
    
    @product.setter
    def product(self,value):
        self._product = value
        self._update_observers()
        
    def _update_observers():
        for observer in self.observers:
            observer()
 
# 观察者
class Observer:
    def __init__(self,inventory):
        self.inventory = inventory
        
    def __call__():
        print(self.inventory.product)
  

代码引用了《python3 面向对象编程第二版》

大家可以想象一下,如果不用观察者模式而要实现相同的功能,就需要在Inventory里面处理不同的observer()方法,需要显式调用不同observer()方法,这样维护起来就会很麻烦,也极其不好扩展。