Python设计模式之观察者模式原理与用法详解


Posted in Python onJanuary 16, 2019

本文实例讲述了Python设计模式之观察者模式原理与用法。分享给大家供大家参考,具体如下:

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

下面是观察者模式的一个demo:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Andy'
"""
大话设计模式
设计模式——观察者模式
观察者模式又叫做发布-订阅模式 (Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更新自己
使用场景:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象待改变
"""
#抽象通知者类
class Subject(object):
  def attach(self, observer):
    pass
  def detach(self,observer):
    pass
  def notify(self):
    pass
#具体通知者类
class Boss(Subject):
  def __init__(self):
    self.observer_list = []
    self.subject_status = ''
  def attach(self, observer):
    self.observer_list.append(observer)
  def detach(self,observer):
    self.observer_list.remove(observer)
  def notify(self):
    for item in self.observer_list:
      item.update()
#抽象观察者类
class Observer(object):
  def __init__(self, name, publish):
    self.name = name
    self.publish = publish
  def update(self):
    pass
#具体观察者类-看股票的人
class StockObserver(Observer):
  def update(self):
    print self.publish.subject_status,self.name,'关闭股票行情,继续工作'
#具体观察者类-看NBA的人
class NbaObserver(Observer):
  def update(self):
    print self.publish.subject_status,self.name,'关闭NBA,继续工作'
if __name__ == "__main__":
  publisher = Boss()
  stocker = StockObserver('Andy',publisher)
  nbaer = NbaObserver('Tracy',publisher)
  publisher.attach(stocker)
  publisher.attach(nbaer)
  publisher.subject_status = '本老板回来了'
  publisher.notify()

运行结果:

本老板回来了 Andy 关闭股票行情,继续工作
本老板回来了 Tracy 关闭NBA,继续工作

上面类的设计如下图:

Python设计模式之观察者模式原理与用法详解

将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性,我们不希望为了维持一致性而使各类紧密耦合,这样会给维护,扩展和重用都带来不便

观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象而不是依赖于具体,从而使得各自的变化都不影响另一边的变化

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
使用Python3中的gettext模块翻译Python源码以支持多语言
Mar 31 Python
Python的装饰器模式与面向切面编程详解
Jun 21 Python
Python编程入门之Hello World的三种实现方式
Nov 13 Python
python enumerate函数的使用方法总结
Nov 15 Python
python实现报表自动化详解
Nov 16 Python
pandas DataFrame数据转为list的方法
Apr 11 Python
对python pandas读取剪贴板内容的方法详解
Jan 24 Python
python 定时任务去检测服务器端口是否通的实例
Jan 26 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
python使用信号量动态更新配置文件的操作
Apr 01 Python
Python利用PyPDF2库获取PDF文件总页码实例
Apr 03 Python
python3从网络摄像机解析mjpeg http流的示例
Nov 13 Python
Django REST framework视图的用法
Jan 16 #Python
Pycharm+Scrapy安装并且初始化项目的方法
Jan 15 #Python
PyCharm 设置SciView工具窗口的方法
Jan 15 #Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 #Python
用Pycharm实现鼠标滚轮控制字体大小的方法
Jan 15 #Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 #Python
python调用opencv实现猫脸检测功能
Jan 15 #Python
You might like
短波问题解答
2021/02/28 无线电
PHP安装全攻略:APACHE
2006/10/09 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
PHP 实现浏览记录并按日期分组
2017/05/11 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
Windows下安装Scrapy
2018/10/17 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
幼儿园教师个人反思
2014/01/30 职场文书
护理专业自我鉴定
2014/01/30 职场文书
幼儿园开学通知
2015/04/24 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
德劲DE1108畅想
2021/04/22 无线电
Java异常处理try catch的基本用法
2021/12/06 Java/Android
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server