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文件和流(实例讲解)
Sep 12 Python
Python实现判断并移除列表指定位置元素的方法
Apr 13 Python
python检测主机的连通性并记录到文件的实例
Jun 21 Python
python 数字类型和字符串类型的相互转换实例
Jul 17 Python
Python单元测试unittest的具体使用示例
Dec 17 Python
Python面向对象程序设计构造函数和析构函数用法分析
Apr 12 Python
Django的性能优化实现解析
Jul 30 Python
python+tkinter实现学生管理系统
Aug 20 Python
Python列表list常用内建函数实例小结
Oct 22 Python
Python 面向对象部分知识点小结
Mar 09 Python
Django实现微信小程序支付的示例代码
Sep 03 Python
Python利用capstone实现反汇编
Apr 06 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实现批量生成App各种尺寸Logo
2015/03/19 PHP
PHP获取文件夹大小函数用法实例
2015/07/01 PHP
在js中使用"with"语句中跨frame的变量引用问题
2007/03/08 Javascript
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
Python类属性与实例属性用法分析
2015/05/09 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
python绘制简单折线图代码示例
2017/12/19 Python
Python工厂函数用法实例分析
2018/05/14 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
django连接oracle时setting 配置方法
2019/08/29 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
医学专业五年以上个人求职信
2013/12/03 职场文书
商铺消防安全责任书
2014/07/29 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
自荐信格式范文
2015/03/04 职场文书
2015年建筑工程工作总结
2015/05/13 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
python开发实时可视化仪表盘的示例
2021/05/07 Python
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python