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

观察者模式的结构

1,Publisher 会向其他对象发送值得关注的事件notifySubscribers。事件会在发布者自身状态改变或执行特定行为后发生。发布者中包含一个允许新订阅者加入subscribe和当前订阅者离开列表unsubscribe的订阅构架。

2,当新事件发生时,发送者会遍历订阅列表并调用每个订阅者对象的通知方法。该方法是在订阅者接口中声明的。

3,Subscriber 接口声明了通知接口。在绝大多数情况下,该接口仅包含一个update方法。该方法可以拥有多个参数,使发布者能在更新时传递事件的详细信息。

4,Concrete Subscriber 具体订阅者,可以执行一些操作来回应发布者的通知。所有具体订阅者类都实现了同样的接口,发布者不与具体类相耦合。

5,订阅者通常需要一些上下文信息来正确地处理更新。因此,发布者通常会将一些上下文数据作为通知方法的参数进行传递。发布者也可将自身作为参数进行传递,使订阅者直接获取所需的数据。

6,Client 会分别创建发布者和订阅者对象,然后为订阅者注册发布者更新。

观察者代码

1 from __future__ importannotations2 from abc importABC, abstractmethod3 from random importrandrange4 from typing importList5

6

7 classSubject(ABC):8 """

9 声明一组用于管理订阅者的方法10 """

11

12 @abstractmethod13 def attach(self, observer: Observer) ->None:14 """

15 添加观察者到subject.16 """

17 pass

18

19 @abstractmethod20 def detach(self, observer: Observer) ->None:21 """

22 从subject删除观察者.23 """

24 pass

25

26 @abstractmethod27 def notify(self) ->None:28 """

29 通知观察者事件的发生.30 """

31 pass

32

33

34 classConcreteSubject(Subject):35 """

36 Subject有一些状态,状态变更需要通知观察者37 """

38 #Subject的状态,所有的订阅者都要有,

39 _state: int =None40

41 #订阅用户列表

42 _observers: List[Observer] =[]43

44 def attach(self, observer: Observer) ->None:45 print("Subject: Attached an observer.")46 self._observers.append(observer)47

48 def detach(self, observer: Observer) ->None:49 self._observers.remove(observer)50

51 #通知所有订阅者

52 def notify(self) ->None:53 """

54 通知接口,触发了所有的订阅用户的update方法55 """

56

57 print("Subject: Notifying observers...")58 for observer inself._observers:59 observer.update(self)60

61 def some_business_logic(self) ->None:62 """

63 一些业务逻辑块,处理业务逻辑后,也可能会触发状态的变更,需要调用notify通知所有订阅者,64 """

65

66 print("\nSubject: state change")67 self._state = randrange(0, 10)68

69 print(f"Subject: My state has changed to: {self._state}")70 self.notify()71

72

73 classObserver(ABC):74 """

75 订阅者声明对象使用的update.76 """

77

78 @abstractmethod79 def update(self, subject: Subject) ->None:80 """

81 接收到状态变更.82 """

83 pass

84

85

86 """

87 具体订阅者,对状态的变更做出具体反应88 """

89

90

91 classConcreteObserverA(Observer):92 def update(self, subject: Subject) ->None:93 if subject._state < 3:94 print("ConcreteObserverA: Reacted to the event")95

96

97 classConcreteObserverB(Observer):98 def update(self, subject: Subject) ->None:99 if subject._state == 0 or subject._state >= 2:100 print("ConcreteObserverB: Reacted to the event")101

102

103 if __name__ == "__main__":104 #The client code.

105

106 subject =ConcreteSubject()107

108 observer_a =ConcreteObserverA()109 subject.attach(observer_a)110

111 observer_b =ConcreteObserverB()112 subject.attach(observer_b)113

114 subject.some_business_logic()115 subject.some_business_logic()116

117 subject.detach(observer_a)118

119 subject.some_business_logic()

适用场景:

1,当一个对象状态的改变需要改变其他对象,或实际对象是事先未知的或动态变化的时,可使用观察者模式。

2,当应用中的一些对象必须观察其他对象时,可使用该模式。

优点:

符合开闭原则,不用修改发布者代码就能引入新的订阅者类。

可以在运行时建立对象之间的联系。

缺点:

订阅者的通知顺序是随机的

作者:Andy

出处:http://www.cnblogs.com/onepiece-andy/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

python 设计模式 观察者_设计模式Python实现-观察者模式相关推荐

  1. python 设计模式 观察者_【python】设计模式之观察者模式

    观察者模式:观察者模式定义了对象之间的一对多依赖,这样当一个对象改变状态时,它的所有对象都会收到依赖并且自动更新. 模式图如下: 观察者模式图 class Observer: "" ...

  2. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  3. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  4. python面试设计模式问题_聊聊 Python 面试最常被问到的几种设计模式(下)

    1. 前言 上篇文章 写到了 Python 最常用的 2 种设计模式,单例模式和工厂模式 本篇文章我们继续聊聊面试中,Python 面试经常被问到的设计模式,即: 构建者模式 代理模式 观察者模式 2 ...

  5. python用设计模式吗_为什么Python不用设计模式?

    原标题:为什么Python不用设计模式? 来自:码农翻身(微信号:coderising) 在遥远的Python王国,有一位少年,非常热爱编程,他的父母想给他报一个班,问了万能的朋友圈以后,发现大家都推 ...

  6. python集群_使用Python集群文档

    python集群 Natural Language Processing has made huge advancements in the last years. Currently, variou ...

  7. python 网页编程_通过Python编程检索网页

    python 网页编程 The internet and the World Wide Web (WWW), is probably the most prominent source of info ...

  8. python机器学习预测_使用Python和机器学习预测未来的股市趋势

    python机器学习预测 Note from Towards Data Science's editors: While we allow independent authors to publish ...

  9. python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合

    本文主要是对Python的数据结构进行了一个总结,常见的数据结构包含:列表list.元组tuple.字典dict和集合set. image 索引 左边0开始,右边-1开始 通过index()函数查看索 ...

最新文章

  1. IName 与 IQueryName2
  2. glide 下载golang.org包问题
  3. SVN 常用操作命令 使用笔记
  4. 浅谈DCIM平台的6化
  5. java中gc是啥_java的gc是什么
  6. Visual Studio“15”启动速度提升
  7. LeetCode MySQL 185. 部门工资前三高的所有员工(dense_rank)
  8. linux 系统tty、pty和pts 的概念及区别(转)
  9. Acrobat如何修改PDF/A模式下的PDF文档
  10. Xcode10:library not found for -lstdc++.6.0.9 临时解决
  11. 对侯捷《Word 排版艺术》的期待
  12. 这几个网站藏着一代人的科技童年……
  13. GIT版本控制(详解)
  14. 整理软件测试分析资料
  15. LOJ#2134 小园丁与老司机
  16. Android 9.0 一定要适配htpps请求?
  17. 改变 ListBox Item 被点击后的蓝色背景
  18. 极路由php插件,极路由SDK
  19. 计算机考研真题解析---计算机网络
  20. matlab声音的滤波处理,MATLAB声音信号的采集与滤波处理

热门文章

  1. linux php连接orcel,Linux下PHP连接Oracle数据库
  2. python封装sql脚本 github_python-SQL查询语句精华使用简要
  3. 1095. 山脉数组中查找目标值(三分+二分)
  4. codeforces 1038a(找最长的前k个字母出现相同次数的字符串)水题
  5. ROS2学习(三).ROS2环境配置
  6. oracle opaque_transform,oracle databse link
  7. 福建职称计算机评聘任,职称聘任工作的有关补充规定(试行)
  8. oracle 052考试,Oracle OCP认证考试题库解析052-5
  9. python 免费空间_总算找到php免费空间
  10. table.render加入php传值,iView中Table通过render添加一个Input如何双向绑定数据