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中list循环语句用法实例
Nov 10 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
Jun 20 Python
python skimage 连通性区域检测方法
Jun 21 Python
Flask框架Flask-Principal基本用法实例分析
Jul 23 Python
Python中fnmatch模块的使用详情
Nov 30 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
用python打印1~20的整数实例讲解
Jul 01 Python
Python3和PyCharm安装与环境配置【图文教程】
Feb 14 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
Mar 06 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
Apr 16 Python
Django中使用Celery的方法步骤
Dec 07 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 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
php单例模式实现方法分析
2015/03/14 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
使用PHP开发留言板功能
2019/11/19 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
jQuery实现的图片分组切换焦点图插件
2015/01/06 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
Python3基础之基本运算符概述
2014/08/13 Python
python计算圆周率pi的方法
2015/07/11 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
Python数据集切分实例
2018/12/08 Python
利用python绘制正态分布曲线
2021/01/04 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
亚马逊意大利站点:Amazon.it
2020/12/31 全球购物
开会迟到检讨书
2014/01/08 职场文书
《桂林山水》教学反思
2014/02/08 职场文书
保险公司年会主持词
2014/03/22 职场文书
项目经理聘任书
2014/03/29 职场文书
使用Ajax实现无刷新上传文件
2022/04/12 Javascript
Oracle中日期的使用方法实例
2022/07/07 Oracle