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中Random和Math模块学习笔记
May 18 Python
利用Python开发实现简单的记事本
Nov 15 Python
Python面向对象class类属性及子类用法分析
Feb 02 Python
浅述python中深浅拷贝原理
Sep 18 Python
django框架使用方法详解
Jul 18 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
Aug 09 Python
python缩进长度是否统一
Aug 02 Python
Python判断变量是否是None写法代码实例
Oct 09 Python
Python字典实现伪切片功能
Oct 28 Python
Python图片处理之图片裁剪教程
May 27 Python
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Oct 16 Python
详解PyTorch模型保存与加载
Apr 28 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中改变图片的尺寸大小的代码
2011/07/17 PHP
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
动态控制Table的js代码
2007/03/07 Javascript
通过隐藏option实现select的联动效果
2009/11/10 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
Vue.js tab实现选项卡切换
2017/05/16 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
深入理解node.js http模块
2018/01/24 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python列表的增删改查实例代码
2018/01/30 Python
python简单实现最大似然估计&scipy库的使用详解
2020/04/15 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
请介绍一下Ant
2016/07/22 面试题
会计专业毕业生自我鉴定
2013/10/29 职场文书
工业设计专业推荐信
2013/10/29 职场文书
财务人员个人求职信范文
2013/12/04 职场文书
优秀毕业生事迹材料
2014/02/12 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
环卫个人总结
2015/03/03 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
浅谈Python中对象是如何被调用的
2022/04/06 Python