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连接mysql数据库的正确姿势
Feb 03 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
May 09 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
python正则表达式之对号入座篇
Jul 24 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
简单了解Python3里的一些新特性
Jul 13 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
python实现串口通信的示例代码
Feb 10 Python
关于多元线性回归分析——Python&SPSS
Feb 24 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
Python如何执行系统命令
Sep 23 Python
详解Python牛顿插值法
May 11 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调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
从python读取sql的实例方法
2020/07/21 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
技校个人求职信范文
2014/01/25 职场文书
校园元旦活动总结
2014/07/09 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
大二学年个人总结
2015/03/03 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
导游词之峨眉山
2019/12/16 职场文书
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang
Java Redisson多策略注解限流
2022/09/23 Java/Android