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中处理字符串之endswith()方法的使用简介
May 18 Python
在Python的Django框架中生成CSV文件的方法
Jul 22 Python
Python中遇到的小问题及解决方法汇总
Jan 11 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
python获取多线程及子线程的返回值
Nov 15 Python
python机器学习实战之树回归详解
Dec 20 Python
python 数字类型和字符串类型的相互转换实例
Jul 17 Python
Python 中字符串拼接的多种方法
Jul 30 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
Jul 03 Python
Python测试模块doctest使用解析
Aug 10 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 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
BBS(php & mysql)完整版(八)
2006/10/09 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
2015/12/31 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
给Javascript数组插入一条记录的代码
2007/08/30 Javascript
IE和Firefox下event事件杂谈
2009/12/18 Javascript
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
微信小程序实现留言板
2018/10/31 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
浅析使用Python操作文件
2017/07/31 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
详解django中使用定时任务的方法
2018/09/27 Python
python统计中文字符数量的两种方法
2019/01/31 Python
Pandas中resample方法详解
2019/07/02 Python
python设置环境变量的作用和实例
2019/07/09 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
公职人员索取回扣检举信
2014/04/04 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
孝女彩金观后感
2015/06/10 职场文书
婚育证明样本
2015/06/16 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL