Python设计模式之观察者模式简单示例


Posted in Python onJanuary 10, 2018

本文实例讲述了Python设计模式之观察者模式。分享给大家供大家参考,具体如下:

观察者模式是一个软件设计模式,一个主题对象包涵一系列依赖他的观察者,自动通知观察者的主题对象的改变,通常会调用每个观察者的一个方法。这个设计模式非常适用于分布式事件处理系统

典型的在观察者模式下:

1.发布者类应该包涵如下方法:

注册能够接收通知的对象
从主对象到注册对象,通知任何变化
未注册对象不能够接收任何通知信息

2.订购者类应该包涵如下:

发布者会调用一个订购者提供的方法,将任何改变告知注册对象。

3.当一个事件会触发了状态的改变,发表者会调用通知方法

总结:订阅者可以在发布对象中注册或者不注册,如此无论什么事件发生,都会触发发布者通过调用通知方法,去通知订购者。这个通知只会在事件发生的时候,去通知已经注册的订购者。

一个简单的python实现:

让我们实现一个不同用户在TechForum 上发布技术邮件的例子,当任何用户发布一个新的邮件,其他用户就会接收到新邮件通知。从对象的角度去看,我们应该有一个 TechForum对象,我们需要有另外一些需要用户对象在TechForum上注册,当新邮件通知的时候,应该发送邮件标题。

一个简单的例子分析会联想到中介机构和雇主的关系。这就是招聘者和应聘者关系的延伸。通过一个工作中介会发布不同种类的工作信息,应聘者会去寻找相关的工作信息,招聘者也会寻找在中介注册过的应聘者。

代码如下:

class Publisher:
  def __init__(self):
    pass
  def register(self):
    pass
  def unregister(self):
    pass
  def notifyAll(self):
    pass
class TechForum(Publisher):
  def __init__(self):
    self._listOfUsers = []
    self.postname = None
  def register(self, userObj):
    if userObj not in self._listOfUsers:
      self._listOfUsers.append(userObj)
  def unregister(self, userObj):
    self._listOfUsers.remove(userObj)
  def notifyAll(self):
    for objects in self._listOfUsers:
      objects.notify(self.postname)
  def writeNewPost(self , postname):
    self.postname = postname
    self.notifyAll()
class Subscriber:
  def __init__(self):
    pass
  def notify(self):
    pass
class User1(Subscriber):
  def notify(self, postname):
    print "User1 notified of a new post %s" % postname
class User2(Subscriber):
  def notify(self, postname):
    print "User2 notified of a new post %s" % postname
class SisterSites(Subscriber):
  def __init__(self):
    self._sisterWebsites = ["Site1" , "Site2", "Site3"]
  def notify(self, postname):
    for site in self._sisterWebsites:
        print "Send nofication to site:%s " % site
if __name__ == "__main__":
  techForum = TechForum()
  user1 = User1()
  user2 = User2()
  sites = SisterSites()
  techForum.register(user1)
  techForum.register(user2)
  techForum.register(sites)
  techForum.writeNewPost("Observe Pattern in Python")
  techForum.unregister(user2)
  techForum.writeNewPost("MVC Pattern in Python")

运行结果:

Python设计模式之观察者模式简单示例

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中的Numeric包和Numarray包使用教程
Apr 13 Python
Python中的测试模块unittest和doctest的使用教程
Apr 14 Python
Python的Django框架中if标签的相关使用
Jul 15 Python
python3音乐播放器简单实现代码
Apr 20 Python
浅谈Python 对象内存占用
Jul 15 Python
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
Python多线程threading模块用法实例分析
May 22 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
PyQt5 界面显示无响应的实现
Mar 26 Python
Python lambda表达式原理及用法解析
Aug 18 Python
python/golang 删除链表中的元素
Sep 14 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 #Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 #Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 #Python
Python中join函数简单代码示例
Jan 09 #Python
Python中顺序表的实现简单代码分享
Jan 09 #Python
python中set()函数简介及实例解析
Jan 09 #Python
Python中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 #Python
You might like
php字符串函数学习之substr()
2015/03/27 PHP
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
Javascript闭包(Closure)详解
2015/05/05 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
jquery validate demo 基础
2015/10/29 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
实用自动化运维Python脚本分享
2018/06/04 Python
python队列Queue的详解
2019/05/10 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
新闻专业应届生求职信
2013/10/31 职场文书
鼓励运动员的广播稿
2014/02/08 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
2015年体育教学工作总结
2015/05/20 职场文书
同意落户证明
2015/06/19 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
校长新学期寄语2016
2015/12/04 职场文书
用Python提取PDF表格的方法
2021/04/11 Python