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中异常重试的解决方案详解
May 05 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
对python判断ip是否可达的实例详解
Jan 31 Python
Python读取表格类型文件代码实例
Feb 17 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
Mar 30 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
Jun 30 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
Mar 04 Python
python区块链持久化和命令行接口实现简版
May 25 Python
Python序列化模块JSON与Pickle
Jun 05 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
第二节 对象模型 [2]
2006/10/09 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
PHP加密解密实例分析
2015/12/25 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
Js sort排序使用方法
2011/10/17 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
JS实现DIV高度自适应窗口示例
2017/02/16 Javascript
几种响应式文字详解
2017/05/19 Javascript
webpack构建的详细流程探底
2018/01/08 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
python 正则表达式 概述及常用字符
2009/05/04 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python中类型关系和继承关系实例详解
2015/05/25 Python
python类装饰器用法实例
2015/06/04 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
python批量提取图片信息并保存的实现
2021/02/05 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
查摆问题自查报告范文
2014/10/13 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
订货会主持词
2015/07/01 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server