一、模式定义

1.观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

2.观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式

3.观察者模式是一种对象行为型模式

二、模式结构

观察者模式包含如下角色。
1. Subject(目标)
目标又称为主题,它是指被观察的对象。在目标中定义了一个观察者集合,它可以存储任意数量的观察者对象,它提供一个接口来增加和删除观察者对象,同时它定义了的通知方法notify()。目标类可以是接口,也可以是抽象类或实现类。
2.ConcreteSubject(具体目标)
具体目标是目标类的子类,通常它包含经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知。同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。
3. Observer(观察者)
观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update(),因此又称为抽象观察者。
4. ConcreteObserver(具体观察者)
在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者Observer中定义的update( )方法。通常在实现时,可以调用具体目标类的attach()方法将自己添加到目标类的观察者集合中或通过detach()方法将自己从目标类的观察者集合中删除。

三、例子

        在天猫华为手机旗舰店,用户可以购买各种不同型号的华为手机,三位华为忠实粉丝,想购买华为 MateX 系列最新款手机,但是因为手机芯片原因,MateX 系列手机一直处于断货状态,网站提供了“到货通知”的选项,只要选择了该选项的用户,在手机到货时就会第一时间收到到货通知,请选择合适的模式设计该模块。
1.Obesrver

# @Time    : 2022/11/21 14:25
# @Author  : ZQH
# @FileName: Observer.py
# @Software: PyCharmfrom abc import ABCMeta, abstractmethod# 抽象观察者
class Zqh0224StaffObserve(metaclass=ABCMeta):@abstractmethoddef update(self,notice): # notice 是一个 notice类对象pass

2.ConcreteObserver

# @Time    : 2022/11/21 14:25
# @Author  : ZQH
# @FileName: ConcreteObserver.py
# @Software: PyCharmfrom Observer import Zqh0224StaffObserveclass Zqh0224HuaweiFans(Zqh0224StaffObserve):def __init__(self,name):self.name = nameself.information = Nonedef update(self,notice):self.information = self.name + '收到消息:' + notice.information

3.Subject

# @Time    : 2022/11/21 14:24
# @Author  : ZQH
# @FileName: Subject.py
# @Software: PyCharm# 目标 天猫华为手机旗舰店
class Zqh0224HuaweiMall():def __init__(self):self.observes = []  # 订阅的观察者列表# 添加观察者def attach(self, obs):self.observes.append(obs)# 删除观察者def detach(self, obs):self.observes.remove(obs)# 发布消息,每个观察者能接受消息def notify(self):for obs in self.observes:obs.update(self)

4.ConcreteSubject

# @Time    : 2022/11/21 14:25
# @Author  : ZQH
# @FileName: ConcreteSubject.py
# @Software: PyCharmfrom Subject import Zqh0224HuaweiMall# 具体目标 到货通知
class Zqh0224ArrivalNotification(Zqh0224HuaweiMall):def __init__(self, company_info=None):super().__init__()self.__company_info = company_info# 读操作@propertydef information(self):return self.__company_info# 写操作@information.setterdef information(self, info):self.__company_info = infoself.notify()

四、优缺点

1.观察者模式的优点
(1)观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递长期,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。
(2)观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,每一个具体观察者都符合抽象观察者的定义。观察目标不需要了解其具体观察者,只需知道它们都有一个共同的接口即可。由于观察目标和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。
(3)观察者模式支持广播通信,观察目标会向所有注册的观察者发出通知,简化了一对多系统设计的难度。
(4)观察者模式符合“开闭原则”的要求,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。

2.观察者模式的缺点
(1)如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
(2)如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用可能导致系统崩溃。
(3)观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

观察者模式(python)相关推荐

  1. python实现观察者模式_观察者模式--python

    参见:http://baike.baidu.com/view/1854779.htm http://blog.csdn.net/huangkangying/article/details/790160 ...

  2. 1.设计模式中监听模式(观察者模式)(Python实现)

    目录 1.什么是监听模式 2.监听模式设计思想 3.监听模式的框架模型 4.分别用框架模型和不用框架模型来解决下面的例子 5.模型说明 6.监听模式根据侧重可以分为推模型和拉模型 7.账号异常登录检测 ...

  3. python设计模式【8】-模型·视图·控制器-复合模式

    UML类图简介 设计模式的分类 面向对象的设计原则 python设计模式[1]-单例模式 python设计模式[2]-工厂模式 python设计模式[3]-门面模式 python设计模式[4]-代理模 ...

  4. python设计模式【7】-模板方法模式

    UML类图简介 设计模式的分类 面向对象的设计原则 python设计模式[1]-单例模式 python设计模式[2]-工厂模式 python设计模式[3]-门面模式 python设计模式[4]-代理模 ...

  5. 设计模式-工厂、建造、观察

    前言 本文为datawhale2022年12月组队学习<大话设计模式>task3打卡学习,内容依然主要以官方所提供的为主. [教程地址]https://github.com/datawha ...

  6. Python设计模式-观察者模式

    Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...

  7. python的编程模式-举例讲解Python设计模式编程中的访问者与观察者模式

    访问者模式我觉得Visitor模式是在补修改已有程序结构前提下,通过添加额外的访问者完成对代码功能的拓展 为什么这样用?当你的类层次较多,在某层结构中增加新的方法,要是在基类上面添加或者变更,可能破坏 ...

  8. 大话设计模式Python实现-观察者模式

    观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更 ...

  9. 设计模式(Python)-观察者模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

  10. python实现观察者模式_举例讲解Python设计模式编程中的访问者与观察者模式

    访问者模式我觉得Visitor模式是在补修改已有程序结构前提下,通过添加额外的访问者完成对代码功能的拓展 为什么这样用?当你的类层次较多,在某层结构中增加新的方法,要是在基类上面添加或者变更,可能破坏 ...

最新文章

  1. VSCODE安装必要的插件实现浏览器中打开,以及显示网址
  2. 阿里云POLARDB如何助力轻松筹打造5亿用户信赖的大病筹款平台?
  3. 打开浏览器提示下载解决方法
  4. python英语-我们用程序整理出了一份Python英语高频词汇表,拿走不谢!
  5. 【原创】用J-LINK烧写ARM开发板的Nor Flash
  6. Linux CenOS7下安装ActivetMQ
  7. MyBatis框架——mybatis插入数据返回主键(mysql、oracle)
  8. 由浅到深理解ROS(7)-URDF
  9. 将来不当科学家,今天不必做科研?
  10. 【报告分享】“流量重构”时代来临,2020-2021中国消费互联网竞争趋势报告-腾讯.pdf(附下载链接)...
  11. WebAPI框架里设置异常返回格式统一
  12. 第三章 文件IO复习
  13. 可方向导不一定连续的例子
  14. Ubuntu最佳字体推荐
  15. SQL语句中查询数据
  16. 基于esp32的物联网设计
  17. Chrome 谷歌浏览器查看网站证书
  18. word 文档多级列表编号设置
  19. 开会总结【1】ADL129
  20. 什么是mx记录?如何设置域名mx记录?

热门文章

  1. 猎豹MFC--不使用向导
  2. 解决css3动画效果在360兼容模式跟猎豹浏览器下不兼容
  3. 饿了么美团红包小程序搭建,外卖优惠券
  4. C盘满了怎么分析C盘使用情况 找出C盘大文件
  5. Arduino IDE安装过程及esp32下载
  6. JavaScript提高,BOM编程,DOM编程
  7. python调用(百度云、腾讯云)API接口表格识别并保存为excel
  8. Hibernate学习笔记二:Session
  9. 群晖nas 配置hfs
  10. simulink模拟电池 CCCV_DCDC充电过程