Python程序中的观察者模式结构编写示例


Posted in Python onMay 27, 2016

察者模式定义
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。
设计原则
为了交互对象之间的松耦合设计而努力。松耦合的设计之所以能让我们建立有弹性的系统,能够应对变化,是因为对象之间的互相依赖降到了最低。

模式结构与说明

Python程序中的观察者模式结构编写示例

1.Subject:主题(目标)接口,主题可以注册、移除对其感兴趣的观察者,在自身数据发生变化的时候,还可以通知这些观察者。一个主题可以有多个观察者,需要注意的是,观察者的顺序应当是无关紧要的。主题也被称为“被观察者”(Observable)
2.所有的观察者必须实现Observer接口,以便主题状态发生变化时,可以被通知
观察者模式是一种广泛使用、非常重要的设计模式,它有利于降低对象间的耦合,同时让对象保持高度协作。该模式的松耦合特性体现在:
1.关于观察者的一切,主题只知道它实现了观察者接口,其它一概不知
2.在任何时候,主题的观察者可以被动态的添加、删除
3.当新类型的观察者出现时,主题的代码不需要进行修改
4.修改主题或者观察者的任一方,对方不会受到影响

示例
通过注释就可以清晰理解~

#observer pattern 
 
class subject():
  def __init__(self,dat):
    self.listobj = list() #主题中的列表变量用来存储观察者
    self.dat = dat #主题中的数据变化时,需要通知观察者
    
  def registerObject(self,obj):
    self.listobj.append(obj) #实现订阅主题的函数
    
  def removeObject(self,obj):
    pass
  
  def notifyObservers(self):#通知各个观察者数据已经发生变化,观察者相应需要更新自己的数据
    for i in range(len(self.listobj)):
      self.listobj[i].update()
      
  def setdat(self,new_dat):#设置数据
    if self.dat != new_dat:
      self.dat = new_dat
      self.notifyObservers()
 
class observer():#观察者
  def __init__(self,sub): #观察者初始化时,需要订阅主题
    self.sub = sub
    self.sub.registerObject(self)
    self.number = self.sub.dat
    
  def update(self):#观察者更新
    self.number = self.sub.dat
  def display(self):
    print self.number
    
if __name__ =="__main__":
  su = subject(10)
  ob1 = observer(su)
  ob1.display()
  ob2 = observer(su)
  ob2.display()
  su.setdat(11)
  ob1.display()
  ob2.display()

   

Python 相关文章推荐
Python数据类型之List列表实例详解
May 08 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
python实现最大优先队列
Aug 29 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
利用Python将多张图片合成视频的实现
Nov 23 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 Python
Python 把两层列表展开平铺成一层(5种实现方式)
Apr 07 Python
Windows下python2.7.8安装图文教程
May 26 #Python
Java Web开发过程中登陆模块的验证码的实现方式总结
May 25 #Python
剖析Python的Twisted框架的核心特性
May 25 #Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 #Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 #Python
使用Python的Twisted框架编写非阻塞程序的代码示例
May 25 #Python
Python的Twisted框架中使用Deferred对象来管理回调函数
May 25 #Python
You might like
php 传值赋值与引用赋值的区别
2010/12/29 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
Angular和百度地图的结合实例代码
2016/10/19 Javascript
JS图片轮播与索引变色功能实例详解
2017/07/06 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
Python 时间处理datetime实例
2008/09/06 Python
Python3.6简单的操作Mysql数据库的三个实例
2018/10/17 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
Python目录和文件处理总结详解
2019/09/02 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
python百行代码自制电脑端网速悬浮窗的实现
2020/05/12 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
python matlab库简单用法讲解
2020/12/31 Python
selenium+python实现基本自动化测试的示例代码
2021/01/27 Python
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
毕业生自荐信的主要内容
2013/10/29 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
政风行风建设责任书
2014/07/23 职场文书
2015年高考寄语或鼓励的话
2015/03/23 职场文书
开业庆典致辞
2015/08/01 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
python pygame 开发五子棋双人对弈
2022/05/02 Python