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新手在作用域方面经常容易碰到的问题
Apr 03 Python
python简单实现获取当前时间
Aug 27 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
Python中property属性实例解析
Feb 10 Python
Python的多维空数组赋值方法
Apr 13 Python
带你认识Django
Jan 15 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
pytorch 实现打印模型的参数值
Dec 30 Python
pytorch下大型数据集(大型图片)的导入方式
Jan 08 Python
python基于socket函数实现端口扫描
May 28 Python
python thrift 实现 单端口多服务的过程
Jun 08 Python
用opencv给图片换背景色的示例代码
Jul 08 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配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
IE和Firefox在JavaScript应用中的兼容性探讨
2008/04/01 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
js取值中form.all和不加all的区别介绍
2014/01/20 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
js实现拖拽效果
2015/02/12 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
python调用摄像头拍摄数据集
2019/06/01 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
Python模块 _winreg操作注册表
2020/02/05 Python
python多维数组分位数的求取方式
2020/03/03 Python
Linux文件操作命令都有哪些
2015/02/27 面试题
求职信的要素有哪些呢
2013/12/26 职场文书
关于读书的活动方案
2014/08/14 职场文书
出纳试用期自我评价
2015/03/10 职场文书
2015年派出所工作总结
2015/04/24 职场文书