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实现的百度站长自动URL提交小工具
Jun 27 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
Django中cookie的基本使用方法示例
Feb 03 Python
python 美化输出信息的实例
Oct 15 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
Jun 28 Python
python turtle 绘制太极图的实例
Dec 18 Python
pip安装tensorflow的坑的解决
Apr 19 Python
python代码中怎么换行
Jun 17 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 Python
Python Sqlalchemy如何实现select for update
Oct 12 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
Python之matplotlib绘制饼图
Apr 13 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+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
php分页思路以及在ZF中的使用
2012/05/30 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
php实现在多维数组中查找特定value的方法
2015/07/29 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
js form action动态修改方法
2008/11/04 Javascript
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
python实现目录树生成示例
2014/03/28 Python
浅谈python对象数据的读写权限
2016/09/12 Python
Python计算两个日期相差天数的方法示例
2017/05/23 Python
Python编程实现正则删除命令功能
2017/08/30 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
2015国际残疾人日活动总结
2015/03/24 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
Python中可变和不可变对象的深入讲解
2021/08/02 Python
Python 中的Sympy详细使用
2021/08/07 Python
JavaScript实现优先级队列
2021/12/06 Javascript