什么是观察者模式呢?
我是这样理解观察者模式的,当我去使用一个设计模式时候,我很喜欢将抽象的问题具体化
1、被观察者
2、被观察者的行为
3、观察者
4、观察者的行为
5、关联2者的类(简单的可以在被观察者里面去关联2者)
首先先来了解一个最简单的观察者模式,我就拿一个最经典的例子来解释
我和小明(观察者)去订报(观察者行为),邮局(被观察者)有报纸(被观察者行为)就会通知我和小明
那么首先来看观察者的方法吧,观察者里面只有一个接口,就是邮件给我报纸,我就有报纸了,只有这一个抽象方法has_news
ObserverInter
代码如下
from abc import ABCMeta,abstractmethod
#观察者接口
class ObserverInter(metaclass=ABCMeta):
@abstractmethod
def has_news(self):
再看来下观察者类的具体实现吧,也就是我和小明,实现ObserverInter
抽象方法
ObserverImpl
代码如下
#观察者实现类
class ObserveInterImpl(ObserverInter):
def __init__(self,name):
self.name = name
def has_news(self):
print("%s收到报纸了"%self.name)
然后就该涉及到被观察者方法接口这块了,也就是邮局实体类要实现的的方法,其实邮局最好只有发送报纸的接口实现
#被观察者接口
class ObserverddInter():
def send_news(self,observers_list):
raise NotImplementedError
然后看邮局的具体实现类
#被观察者实现类
class ObserveredInterImpl(ObserverddInter):
def send_news(self,observers_list):
for observer in observers_list:
observer.has_news()
以上观察者(我和小明),被观察者(邮局)都构建好了,那么接下来就构造一个控制器,用来关联观察者和被观察者,里面有添加、取消观察者的功能
#控制器
class ControlerInter(ObserverddInter):
def __init__(self,ObserveredInterImpl):
self.ObserveredInterImpl = ObserveredInterImpl
self.list_ = []
#注册观察者
def registSubscriber(self,observers):
self.list_.append(observers)
#解注册观察者
def cancleSubscriber(self,observers):
self.list_.remove(observers)
#发送报纸
def send_news(self,observers_list = None):
self.ObserveredInterImpl.send_news(self.list_)
最后看测试代码
observer1 = ObserveInterImpl("safly")
observer2 = ObserveInterImpl("xiaoming")
observered = ObserveredInterImpl()
controller = ControlerInter(observered)
controller.registSubscriber(observer1)
controller.registSubscriber(observer2)
controller.send_news()
最后输出如下:
safly收到报纸了
xiaoming收到报纸了
以下来自网友:
三、观察者模式的优点和应用场景
优点:
1、观察者与被观察者之间是抽象耦合的;
2、可以将许多符合单一职责原则的模块进行触发,也可以很方便地实现广播。
应用场景:
1、消息交换场景。如上述说到的消息队列等;
2、多级触发场景。比如支持中断模式的场景中,一个中断即会引发一连串反应,就可以使用观察者模式。
四、观察者模式的缺点
1、观察者模式可能会带来整体系统效率的浪费;
2、如果被观察者之间有依赖关系,其逻辑关系的梳理需要费些心思