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重新引入被覆盖的自带function
Jul 16 Python
用Python解析XML的几种常见方法的介绍
Apr 09 Python
Python基于Floyd算法求解最短路径距离问题实例详解
May 16 Python
3分钟学会一个Python小技巧
Nov 23 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
Python调用shell命令常用方法(4种)
May 11 Python
python中rb含义理解
Jun 18 Python
Django中和时区相关的安全问题详解
Oct 12 Python
python中remove函数的踩坑记录
Jan 04 Python
python如何在word中存储本地图片
Apr 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
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
用PHP和ACCESS写聊天室(四)
2006/10/09 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
Jquery焦点图实例代码
2014/11/25 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
基于BootStarp的Dailog
2016/04/28 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
常用的javascript设计模式
2017/01/11 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
Python计算程序运行时间的方法
2014/12/13 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
python异常触发及自定义异常类解析
2019/08/06 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
详解Python中import机制
2020/09/11 Python
灵泰克Java笔试题
2016/01/09 面试题
教师应聘自荐信范文
2014/03/14 职场文书
2014年大学学生会工作总结
2014/12/02 职场文书
工作检讨书范文
2015/01/23 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
网络研修随笔感言
2015/11/18 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL