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实现在windows服务中新建进程的方法
Jun 30 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
python获取服务器响应cookie的实例
Dec 28 Python
django中forms组件的使用与注意
Jul 08 Python
Python利用requests模块下载图片实例代码
Aug 12 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 Python
python tornado使用流生成图片的例子
Nov 18 Python
基于Python检测动态物体颜色过程解析
Dec 04 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
python函数中将变量名转换成字符串实例
May 11 Python
python写文件时覆盖原来的实例方法
Jul 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
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
Python pandas自定义函数的使用方法示例
2019/11/20 Python
python实现从wind导入数据
2019/12/03 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
大学生毕业自荐信
2013/10/10 职场文书
小学教师的个人自我鉴定
2013/10/26 职场文书
在职人员函授期间自我评价分享
2013/11/08 职场文书
门卫岗位安全职责
2013/12/13 职场文书
银行求职信个人范文
2013/12/16 职场文书
教师开学感言
2014/02/14 职场文书
采购求职信
2014/03/17 职场文书
文明工地标语
2014/06/16 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
退休教师追悼词
2015/06/23 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python