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的web.py框架下的application.py模块
May 02 Python
python图像处理之镜像实现方法
May 30 Python
Python的Django框架下管理站点的基本方法
Jul 17 Python
python3 与python2 异常处理的区别与联系
Jun 19 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 Python
python中加背景音乐如何操作
Jul 19 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
python mock测试的示例
Oct 19 Python
Python中logging日志的四个等级和使用
Nov 17 Python
基于Python爬取搜狐证券股票过程解析
Nov 18 Python
Django给表单添加honeypot验证增加安全性
May 06 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 开发环境配置(Zend Studio)
2010/04/28 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
javascript生成json数据简单示例分享
2014/02/14 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
[22:59]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现字符串格式化的方法小结
2017/02/20 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
Python中logging实例讲解
2019/01/17 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
Lou & Grey美国官网:主打舒适性面料服饰
2017/12/21 全球购物
旷课检讨书2000字
2014/01/14 职场文书
交通工程专业推荐信
2014/09/06 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
年会主持人开场白台词
2015/05/29 职场文书
公证书
2019/04/17 职场文书
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
【海涛教你打DOTA】虚空假面第一视角骨弓3房29杀
2022/04/01 DOTA