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中用于计算指数的exp()方法
May 14 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
Python 从列表中取值和取索引的方法
Dec 25 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
利用Python小工具实现3秒钟将视频转换为音频
Oct 29 Python
使用python动态生成波形曲线的实现
Dec 04 Python
opencv-python 读取图像并转换颜色空间实例
Dec 09 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
Python如何绘制日历图和热力图
Aug 07 Python
Pycharm快捷键配置详细整理
Oct 13 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
图形数字验证代码
2006/10/09 PHP
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
php smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
php中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
Prototype Number对象 学习
2009/07/19 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
详解JavaScript语法对{}处理的坑爹之处
2014/06/05 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
家长给老师的道歉信
2014/01/13 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
指导教师推荐意见
2015/06/05 职场文书
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS