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实现简单温度转换的方法
Mar 13 Python
Python使用Flask框架同时上传多个文件的方法
Mar 21 Python
利用Python开发微信支付的注意事项
Aug 19 Python
简单谈谈Python中的反转字符串问题
Oct 24 Python
Python 调用Java实例详解
Jun 02 Python
python 表达式和语句及for、while循环练习实例
Jul 07 Python
Python3.4解释器用法简单示例
Mar 22 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
Django在pycharm下修改默认启动端口的方法
Jul 26 Python
基于python+selenium的二次封装的实现
Jan 06 Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 02 Python
Python中rapidjson参数校验实现
Jul 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
elgg 获取文件图标地址的方法
2010/03/20 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
php四种定界符详解
2017/02/16 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
Python hashlib模块的使用示例
2020/10/09 Python
世界最大的票务市场:viagogo
2017/02/16 全球购物
学前班教师的自我鉴定
2013/12/05 职场文书
英语生日邀请函
2014/01/23 职场文书
八一演出活动方案
2014/02/03 职场文书
店面销售职位的职责
2014/03/09 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
家长对学生的评语
2014/04/18 职场文书
大班幼儿评语大全
2014/04/30 职场文书
学习十八大的心得体会
2014/09/01 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
房地产置业顾问工作总结
2015/10/23 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
深入理解go slice结构
2021/09/15 Golang