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 pdb调试方法分享
Jan 21 Python
python控制台显示时钟的示例
Feb 24 Python
python实现FTP服务器服务的方法
Apr 11 Python
Python3简单实例计算同花的概率代码
Dec 06 Python
python进行两个表格对比的方法
Jun 27 Python
Python爬虫将爬取的图片写入world文档的方法
Nov 07 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
python如何快速生成时间戳
Jul 21 Python
django数据模型中null和blank的区别说明
Sep 02 Python
Python实现石头剪刀布游戏
Jan 20 Python
python快速安装OpenCV的步骤记录
Feb 22 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导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
php使用GeoIP库实例
2014/06/27 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
layui实现数据分页功能
2019/07/27 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
python用字典统计单词或汉字词个数示例
2014/04/22 Python
python分析作业提交情况
2017/11/22 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
windows下python和pip安装教程
2018/05/25 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
法国体育用品商店:GO Sport
2019/10/23 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
PyQt 如何创建自定义QWidget
2021/03/24 Python
应届大专毕业生个人自荐信
2013/09/22 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
教师节寄语2015
2015/03/23 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
大学生受助感言
2015/08/01 职场文书
python中的装饰器该如何使用
2021/06/18 Python
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
Nginx本地配置SSL访问的实例教程
2022/05/30 Servers