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模块之time模块(实例讲解)
Sep 13 Python
django模板结构优化的方法
Feb 28 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
Python实现的多进程拷贝文件并显示百分比功能示例
Apr 09 Python
python3.x 生成3维随机数组实例
Nov 28 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 Python
matplotlib自定义鼠标光标坐标格式的实现
Jan 08 Python
python 解决微分方程的操作(数值解法)
May 26 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 23 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
基于mysql的bbs设计(五)
2006/10/09 PHP
谈谈新手如何学习PHP
2006/12/23 PHP
PHP 在线翻译函数代码
2009/05/07 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
jquery ui resizable bug解决方法
2010/10/26 Javascript
jQuery 幻灯片插件(带缩略图功能)
2011/01/24 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
js实现移动端图片滑块验证功能
2020/09/29 Javascript
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
Python 画出来六维图
2019/07/26 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
在python中使用nohup命令说明
2020/04/16 Python
python如何快速生成时间戳
2020/07/21 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
母亲节演讲稿范文
2014/01/02 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
html实现弹窗的实例
2021/06/09 HTML / CSS
python获取字符串中的email
2022/03/31 Python
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js