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 相关文章推荐
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
python实现复制整个目录的方法
May 12 Python
python之Socket网络编程详解
Sep 29 Python
Python实现选择排序
Jun 04 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
Python设计模式之职责链模式原理与用法实例分析
Jan 11 Python
python 切换root 执行命令的方法
Jan 19 Python
python网络应用开发知识点浅析
May 28 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
pytorch中图像的数据格式实例
Feb 11 Python
IntelliJ 中配置 Anaconda的过程图解
Jun 01 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 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中对缓冲区的控制实现代码
2013/09/29 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
flash遮住div问题的正确解决方法
2014/02/27 Javascript
nodejs教程之入门
2014/11/21 NodeJs
javascript计时器详解
2015/02/28 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
JS+HTML5实现图片在线预览功能
2017/07/22 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
JS实现简易日历效果
2021/01/25 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
企事业单位求职者的自我评价
2013/12/28 职场文书
迟到检讨书900字
2014/01/14 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记