定义:

  定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖的对象都会得到通知并被自动更新。

  观察者模式是对象的行为模式,又叫发布-订阅(pubish/subscribe)模式,模型-视图(Model/View模式),源-监听器(Source/Listener)模式或从属者(Dependents)模式。

角色:

  抽象主题,具体主题(发布者), 抽象观察者,具体观察者(订阅者)

适用场景:

    当一个抽象模型有两个方面,其中一个方面依赖于另一个方面.将两者封装在独立的对象中以使它们各自独立的改变和复用

当一个对象的改变需要同时改变其他对象,而且不知道具体有多少对象以待改变

当一个对象必须通知其他对象,而又不知道其他对象是谁,即这些对象之间是解耦的

优点:

  目标与观察者之间的耦合最小

缺点:

  多个观察者之间互不知道对方的存在,因此一个观察者对主题的修改可能造成错误的更新


好, 概念说完来实际场景,以我目前公司业务为背景,产品上线后经常会收到用户反馈bug。那么通常由运营同事收集bug-》开发修复bug-》测试验证bug-》运维发布新版本到线上

直接上代码:

class OBperson():
'抽象观察者'
def updata(self):
pass class TestOB(OBperson):
'具体观察者'
def updata(self):
print('I am tester, Verification bug') class Devob(OBperson):
'具体观察者'
def updata(self):
print('i am developing , Fix bug') class Announcerob(OBperson):
'具体观察者'
def updata(self):
print('i am announcer, release new version') class OBperation():
'具体发布者'
def __init__(self):
self.__observers = [] def collect_bug(self):
print('Number of bugs collected : ')
self.notifyObserver() def addOBserver(self, observer):
self.__observers.append(observer) def removeOBserver(self, observer):
self.__observers.remove(observer) def notifyObserver(self):
for ob in self.__observers:
ob.updata() if __name__ == '__main__':
p = OBperation()
p.addOBserver(Devob())
p.addOBserver(TestOB())
p.addOBserver(Announcerob())
p.collect_bug()

运行结果:

 设计要点:

  被观察者至少需要有三个方法:添加监听者, 移除监听者, 通知OBserver的方法,观察者至少要有一个方法:更新方法,更新当前内容,

并作出相应处理

推模型和拉模型:

  观察者模式根据其侧重的功能还可以分为推模型和拉模型。

  推模型:被观察者对象向观察者推送主题的详细信息,不管观察者是否需要,推送的信息通常是主题对象的全部或部分数据。一般这种模型的实现中,会把被观察者对象中的全部或部分信息通过 update 的参数传递给观察者 [update(Object obj) ,通过 obj 参数传递]。

  拉模型:被观察者在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到被观察者对象中获取,相当于是观察者从被观察者对象中拉数据。一般这种模型的实现中,会把被观察者对象自身通过 update 方法传递给观察者 [update(Observable observable ),通过 observable 参数传递 ],这样在观察者需要获取数据的时候,就可以通过这个引用来获取了。

python设计模式-观察者的更多相关文章

  1. python——设计模式

    设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情 ...

  2. Python设计模式 - 总览(更新中...)

    最近打算重构部分python项目,有道是"工欲善其事,必先利其器",所以有必要梳理一下相关设计模式.每次回顾基本概念或底层实现时都会有一些新的收获,希望这次也不例外. 本系列打算先 ...

  3. python设计模式第2版

    python设计模式第2版 目录 第1章 设计模式简介 1 1.1 理解面向对象编程 1 1.1.1 对象 2 1.1.2 类 2 1.1.3 方法 2 1.2 面向对象编程的主要概念 3 1.2.1 ...

  4. python设计模式浅析

    今天简单聊聊python的设计模式,GOF设计模式(c++)和Head first design pattern(Java)是两本设计模式的经典,基本可以照搬在python上面,但是你会发现pytho ...

  5. Python设计模式 - UML - 对象图(Object Diagram)

    简介 对象图和类图的基本概念是类似的,可以看作类图在系统某一时刻的镜像,显示了该时刻系统中参与交互的各个对象以及它们之间的关系. 对象图的元素包括对象.链接.包,元素之间的关系和类图相似. 对象图建模 ...

  6. Python 设计模式之路

    备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Python 设计模式之路(一)——设计模式 初识 Python 设计模式之路(二)——简单工厂.工厂.抽象工厂模式 ...

  7. 最全36种python设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...

  8. Python设计模式 - UML - 类图(Class Diagram)

    简介 类图是面向对象分析和设计的核心,用来描述系统各个模块中类与类之间.接口与接口之间.类与接口之间的关系,以及每个类的属性.操作等特性,一般在详细设计过程中实施. 类图本身就是现实世界的抽象,是对系 ...

  9. python设计模式之门面模式

    一.结构型设计模式 门面模式与单例模式,工厂模式不同,它是一种结构型模式. 结构型模式描述如何将对象和类组合成更大的结构 结构型模式是一种能够简化设计工作的模式,它能找出更简单的方法来认识或表示实体之 ...

随机推荐

  1. 2010_3_1最新 完整 FFMPEG 编译详解

    在网上看了很多编译详解,都很零散.经过自己的编译,解决一些BUG,在此分享自己的一些经验... 话不多说了!直接上贴. 第一步:准备编译平台. 需要 一个 MinGW 和 一个 MSYS 安装包 以及 ...

  2. Linux/Windows 文件交互读取转义字符变换

  3. Java自学编程学习之路资源合集

    Java Web学习 STEP.1---Java基础最重要 工欲善其事,必先利其器.想要学好Java Web,或者说想要开始学Java Web,Java的基础是必不可少. 基本语法(★★★★★) 数组 ...

  4. cbp2make使用

    codeblock中的cbp2make插件能自动生成makefile文件,这里介绍一下从安装到使用到的过程. 首先下载cbp2make,下载的包后缀名是.tar.gz.Linux里双击该下载文件,解压 ...

  5. C#更改操作系统时间

    using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...

  6. SOFA 源码分析 — 自动故障剔除

    前言 集群中通常一个服务有多个服务提供者.其中部分服务提供者可能由于网络,配置,长时间 fullgc ,线程池满,硬件故障等导致长连接还存活但是程序已经无法正常响应.单机故障剔除功能会将这部分异常的服 ...

  7. 箭头函数不会修改this

    function Person () { this.name = 'little bear', this.age = 18 setTimeout(()=>{ console.log(this ) ...

  8. .net自定义错误页面实现升级篇

    问题描述: 在上一篇博文 ".net自定义错误页面实现" 中已经介绍了在.net中如何实现自定义错误页面实现(有需要者可以去上一篇博文了解),单纯按照上一篇博文那样设置,能够实现所 ...

  9. Linux下的磁盘分区和逻辑卷

    一.硬盘接口类型 硬盘的接口主要有IDE.SATA.SCSI .SAS和光纤通道等五种类型.其中IDE和SATA接口硬盘多用于家用产品中,也有部分应用于服务器,SATA是一种新生的硬盘接口类型,已经取 ...

  10. mysql导入数据中文乱码_ubuntu

    1.在ubuntu中mysql的部分编码格式不是utf-8,故在导文件的时候会出现中文乱码,Windows中编码格式为gbk,因此要修改mysql的编码方式为utf-8. 2.查看MySQL编码格式: ...