适用场景
观察者模式类似于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()方法,这样维护起来就会很麻烦,也极其不好扩展。