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处理html转义字符的方法详解
Jul 01 Python
详谈Python基础之内置函数和递归
Jun 21 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
用python统计代码行的示例(包括空行和注释)
Jul 24 Python
python实现淘宝秒杀脚本
Jun 23 Python
Python线程之定位与销毁的实现
Feb 17 Python
python实现批量注册网站用户的示例
Feb 22 Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 Python
Python3自定义json逐层解析器代码
May 11 Python
python openCV实现摄像头获取人脸图片
Aug 20 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 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中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
2016/10/13 PHP
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
Python简单进程锁代码实例
2015/04/27 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
python如何实现递归转非递归
2021/02/25 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
个人简历自我鉴定
2013/10/11 职场文书
活动邀请函范文
2014/01/19 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
商务经理岗位职责
2014/08/03 职场文书
对照检查剖析材料
2014/09/30 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
Python3.10的一些新特性原理分析
2021/09/15 Python