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中用pycurl监控http响应时间脚本分享
Feb 02 Python
深入Python函数编程的一些特性
Apr 13 Python
python 读写中文json的实例详解
Oct 29 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
May 21 Python
Python图像处理之gif动态图的解析与合成操作详解
Dec 30 Python
使用python Telnet远程登录执行程序的方法
Jan 26 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
python numpy存取文件的方式
Apr 01 Python
windows环境中利用celery实现简单任务队列过程解析
Nov 29 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 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
Adodb的十个实例(清晰版)
2006/12/31 PHP
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
php 无限级 SelectTree 类
2009/05/19 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
基于php编程规范(详解)
2017/08/17 PHP
JScript中的"this"关键字使用方式补充材料
2007/03/08 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
浅谈Angular7 项目开发总结
2018/12/19 Javascript
详解vue高级特性
2020/06/09 Javascript
浅析Python中return和finally共同挖的坑
2017/08/18 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
pytest中文文档之编写断言
2019/09/12 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
工厂门卫岗位职责
2013/11/25 职场文书
银行工作检查书范文
2014/01/31 职场文书
北京申奥口号
2014/06/19 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
2014年客服工作总结与计划
2014/12/09 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
大学生逃课检讨书
2015/05/04 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
导游词之西安骊山
2019/12/03 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技