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实现二分法算法实例
Feb 02 Python
分析Python读取文件时的路径问题
Feb 11 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
详解Django rest_framework实现RESTful API
May 24 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
Django错误:TypeError at / 'bool' object is not callable解决
Aug 16 Python
django实现类似触发器的功能
Nov 15 Python
python目标检测给图画框,bbox画到图上并保存案例
Mar 10 Python
python3中TQDM库安装及使用详解
Nov 18 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中如何直接执行SHELL
2013/06/28 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
Python检测数据类型的方法总结
2019/05/20 Python
python日志模块logbook使用方法
2019/09/19 Python
Python能做什么
2020/06/02 Python
TripAdvisor越南:全球领先的旅游网站
2017/09/21 全球购物
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
物流专业大学生求职信范文
2013/10/28 职场文书
采购主管工作职责
2013/12/12 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
食品质检员岗位职责
2015/04/08 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
解析MySQL索引的作用
2022/03/03 MySQL
vue封装数字翻牌器
2022/04/20 Vue.js