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程序来判断文本的语种
Apr 07 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
网站渗透常用Python小脚本查询同ip网站
May 08 Python
python实现神经网络感知器算法
Dec 20 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
用于业余项目的8个优秀Python库
Sep 21 Python
对python操作kafka写入json数据的简单demo分享
Dec 27 Python
python3.x 生成3维随机数组实例
Nov 28 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
python利用后缀表达式实现计算器功能
Feb 22 Python
python 实现mysql自动增删分区的方法
Apr 01 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中smarty实现多模版网站的方法
2015/06/11 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
JavaScript的目的分析
2007/01/05 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
js实现日期级联效果
2014/01/23 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
Python日期时间Time模块实例详解
2019/04/15 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
大学生自我鉴定
2013/12/16 职场文书
财务总监岗位职责
2014/03/07 职场文书
英语专业自荐书
2014/06/13 职场文书
如何写辞职书
2015/02/26 职场文书
离婚被告答辩状
2015/05/22 职场文书
Python anaconda安装库命令详解
2021/10/16 Python