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中的len()函数的使用
Apr 07 Python
将Python中的数据存储到系统本地的简单方法
Apr 11 Python
Python list操作用法总结
Nov 10 Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
Python迭代器定义与简单用法分析
Apr 30 Python
详解基于django实现的webssh简单例子
Jul 17 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
python numpy之np.random的随机数函数使用介绍
Oct 06 Python
python中删除某个元素的方法解析
Nov 05 Python
详解python变量与数据类型
Aug 25 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读取IMAP邮件
2006/10/09 PHP
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
php入门教程 精简版
2009/12/13 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
javascript 面向对象编程基础:继承
2009/08/21 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
vue.js入门教程之计算属性
2016/09/01 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
JavaScript无缝滚动效果的实例代码
2017/03/27 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
python二叉树的实现实例
2013/11/21 Python
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
Python Web版语音合成实例详解
2019/07/16 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
瑞典度假品牌:OAS
2019/05/28 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
光电信息专业应届生求职信
2013/10/07 职场文书
大学生演讲稿范文
2014/01/11 职场文书
七一表彰活动方案
2014/01/18 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
2014年大学生党课心得体会范文
2014/03/29 职场文书
大学体育课感想
2015/08/10 职场文书
感恩父母主题班会
2015/08/12 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
flex弹性布局详解
2022/03/20 HTML / CSS