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 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
Python中字典和集合学习小结
Jul 07 Python
python爬取拉勾网职位数据的方法
Jan 24 Python
使用python爬取B站千万级数据
Jun 08 Python
对Python+opencv将图片生成视频的实例详解
Jan 08 Python
python实现的生成word文档功能示例
Aug 23 Python
python处理document文档保留原样式
Sep 23 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
python模拟实现分发扑克牌
Apr 22 Python
Python闭包与装饰器原理及实例解析
Apr 30 Python
Python Charles抓包配置实现流程图解
Sep 29 Python
django使用多个数据库的方法实例
Mar 04 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
克隆一个新项目的快捷方式
2013/04/10 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
实现图片首尾平滑轮播(JS原生方法—节流)
2017/10/17 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
浅析Python中else语句块的使用技巧
2016/06/16 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
Python聊天室程序(基础版)
2018/04/01 Python
使用python批量修改文件名的方法(视频合并时)
2020/03/24 Python
好学生评语大全
2014/05/05 职场文书
学校春季防火方案
2014/06/08 职场文书
奉献家乡演讲稿
2014/09/16 职场文书
企业催款函范本
2015/06/24 职场文书