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批量修改文件名的实现代码
Sep 01 Python
跟老齐学Python之正规地说一句话
Sep 28 Python
详解python中requirements.txt的一切
Mar 03 Python
python3使用pyqt5制作一个超简单浏览器的实例
Oct 19 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
Python+OpenCV采集本地摄像头的视频
Apr 25 Python
python 字符串常用函数详解
Sep 11 Python
python对一个数向上取整的实例方法
Jun 18 Python
基于Python爬取素材网站音频文件
Oct 21 Python
appium+python自动化配置(adk、jdk、node.js)
Nov 17 Python
python自动化测试之Selenium详解
Mar 13 Python
详解Python内置模块Collections
Mar 22 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
php 操作调试的方法
2012/07/12 PHP
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
Javascript的一种模块模式
2008/03/22 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
原生JS检测CSS3动画是否结束的方法详解
2019/01/27 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
实现vuex原理的示例
2020/10/21 Javascript
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python简单的函数定义和用法实例
2015/05/07 Python
详解python之heapq模块及排序操作
2019/04/04 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
学生党员思想汇报
2013/12/28 职场文书
超市5.1促销活动
2014/01/15 职场文书
小学校园活动策划
2014/01/30 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
食品安全承诺书范文
2014/08/29 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
python实现自定义日志的具体方法
2021/05/28 Python