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 错误和异常小结
Oct 09 Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
Python 登录网站详解及实例
Apr 11 Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 Python
python绘制地震散点图
Jun 18 Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 Python
python 实现绘制整齐的表格
Nov 18 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
Python post请求实现代码实例
Feb 28 Python
解决windows下python3使用multiprocessing.Pool出现的问题
Apr 08 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
python爬虫爬取图片的简单代码
Jan 18 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
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
php cookie中点号(句号)自动转为下划线问题
2014/10/21 PHP
php中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
phpinfo的知识点总结
2019/10/10 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
IE 下的只读 innerHTML
2009/08/21 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
js跳转页面方法总结
2014/01/29 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
jQuery操作cookie
2016/08/08 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
jQuery Plupload上传插件的使用
2017/04/19 jQuery
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
Python输入二维数组方法
2018/04/13 Python
Python装饰器语法糖
2019/01/02 Python
Python实现word2Vec model过程解析
2019/12/16 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
公司庆典活动邀请函
2014/01/09 职场文书
运动会入场词60字
2014/02/15 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书