设计模式之观察者模式
1. 什么是观察者模式?
监听者模式是一种一对多的关系,可以有任意一个或多个观察者对象同时监听某一个对象,监听的对象叫观察者,被监听的对象叫被观察者,
被观察者的状态或内容发送改变的时候,会通知所有的观察者对象,使他们做出相对应的变化。
2.注意事项
要明白谁是观察者,谁是被观察者。只要明白了他们之间的关系,编码也就很好编写了。
3.优缺点:
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点:
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
4.UMI图

5.代码
from abc import ABCMeta,abstractclassmethod
class Observer(metaclass=ABCMeta):
@abstractclassmethod
def update(self):
pass
class Observable():
def __init__(self):
self._observables = []
def set_observables(self):
self.notifyallobservable()
def add_observables(self,observable):
self._observables.append(observable)
def remove_observable(self,observable):
self._observables.remove(observable)
def notifyallobservable(self):
pass
class ConcreteObservable(Observable):
def __init__(self,a):
super().__init__()
self.a = a
def notifyallobservable(self):
if self.a in [1,2]:
for _ in self._observables:
_.update()
class Subscribe1(Observer):
def update(self):
print("具体观察者 当背观察者发送改变的时候做出响应")
class Subscribe2(Observer):
def update(self):
print("具体观察者 当背观察者发送改变的时候做出响应")
class ObserverPattern():
def __init__(self,a):
self.a = a
def run(self):
observable = ConcreteObservable(self.a )
subscribe1 = Subscribe1()
subscribe2 = Subscribe2()
observable.add_observables(subscribe1)
observable.add_observables(subscribe2)
observable.notifyallobservable()
if __name__ == "__main__":
ObserverPattern(1).run()
ObserverPattern(3).run()