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服务器代码核心程序
Sep 01 Python
利用Python的Twisted框架实现webshell密码扫描器的教程
Apr 16 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
Python和Go语言的区别总结
Feb 20 Python
Python实现Linux监控的方法
May 16 Python
PyQt5实现简易电子词典
Jun 25 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
python 实现保存最新的三份文件,其余的都删掉
Dec 22 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
Python如何输出整数
Jun 07 Python
python绘制趋势图的示例
Sep 17 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
重置版宣传动画
2020/04/09 魔兽争霸
YII框架常用技巧总结
2019/04/27 PHP
javascript基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
2008/08/05 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
Javascript表达式中连续的 && 和 || 之赋值区别
2010/10/17 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
js与运算符和或运算符的妙用
2014/02/14 Javascript
js获取域名的方法
2015/01/27 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
python构建深度神经网络(续)
2018/03/10 Python
python ddt实现数据驱动
2018/03/14 Python
浅谈django orm 优化
2018/08/18 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
详解盒子端CSS动画性能提升
2021/05/24 HTML / CSS
nginx静态资源的服务器配置方法
2022/07/07 Servers