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 相关文章推荐
Python实现优先级队列结构的方法详解
Jun 02 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
Django数据库表反向生成实例解析
Feb 06 Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
Djang的model创建的字段和参数详解
Jul 27 Python
Python turtle库绘制菱形的3种方式小结
Nov 23 Python
Python实现上下文管理器的方法
Aug 07 Python
python实现xml转json文件的示例代码
Dec 30 Python
Django视图类型总结
Feb 17 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
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
php文件上传的简单实例
2013/10/19 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
jquery插件orbit.js实现图片折叠轮换特效
2015/04/14 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
详解nuxt sass全局变量(公共scss解决方案)
2018/06/27 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python队列的定义与使用方法示例
2017/06/24 Python
python利用sklearn包编写决策树源代码
2017/12/21 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
Python headers请求头如何实现快速添加
2020/11/03 Python
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
热能动力工程毕业生自荐信
2013/11/07 职场文书
医学专业毕业生个人求职信
2013/12/25 职场文书
学习委员自我鉴定
2014/01/13 职场文书
公司的力量观后感
2015/06/05 职场文书
推普标语口号大全
2015/12/26 职场文书
浅谈Python响应式类库RxPy
2021/06/14 Python