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使用ctypes模块调用windowsapi获取系统版本示例
Apr 17 Python
python随机生成指定长度密码的方法
Apr 04 Python
用pickle存储Python的原生对象方法
Apr 28 Python
对python中array.sum(axis=?)的用法介绍
Jun 28 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
Python实现对特定列表进行从小到大排序操作示例
Feb 11 Python
pycharm重命名文件的方法步骤
Jul 29 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
Python json转字典字符方法实例解析
Apr 13 Python
用opencv给图片换背景色的示例代码
Jul 08 Python
matplotlib grid()设置网格线外观的实现
Feb 22 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 代码优化的42条建议 推荐
2009/09/25 PHP
php反射应用示例
2014/02/25 PHP
分享php分页的功能模块
2015/06/16 PHP
php获取图片信息的方法详解
2015/12/10 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
JavaScript面象对象设计
2008/04/28 Javascript
JavaScript 创建对象
2009/07/17 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
document.getElementById介绍
2011/09/13 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python 的 with 语句详解
2014/06/13 Python
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
python实现上传下载文件功能
2020/11/19 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
Python创建或生成列表的操作方法
2019/06/19 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
俄罗斯马克西多姆家居用品网上商店:Максидом
2020/02/06 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
车队司机自我鉴定
2014/03/02 职场文书
企业读书活动总结
2014/06/30 职场文书
学前教育见习总结
2015/06/23 职场文书