python设计模式---观察者模式

什么是观察者模式呢?
我是这样理解观察者模式的,当我去使用一个设计模式时候,我很喜欢将抽象的问题具体化
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、如果被观察者之间有依赖关系,其逻辑关系的梳理需要费些心思
    原文作者:金丙坤
    原文地址: https://blog.csdn.net/u013210620/article/details/79767118
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞