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 相关文章推荐
在windows系统中实现python3安装lxml
Mar 23 Python
Python 专题四 文件基础知识
Mar 20 Python
python WindowsError的错误代码详解
Jul 23 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
Dec 09 Python
python实现多人聊天室
Mar 31 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
python实现银联支付和支付宝支付接入
May 07 Python
基于Django signals 信号作用及用法详解
Mar 28 Python
利用Opencv实现图片的油画特效实例
Feb 28 Python
Python机器学习之基于Pytorch实现猫狗分类
Jun 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
第一个无线电台是由谁发明的
2021/03/01 无线电
php将session放入memcached的设置方法
2014/02/14 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
node实现登录图片验证码的示例代码
2018/04/20 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
python检测远程端口是否打开的方法
2015/03/14 Python
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
django的登录注册系统的示例代码
2018/05/14 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
简单了解python数组的基本操作
2019/11/26 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
上海方立数码笔试题
2013/10/18 面试题
信息技术毕业生自荐信范文
2014/03/13 职场文书
林肯就职演讲稿
2014/05/19 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
新员工考核评语
2014/12/31 职场文书
西安兵马俑导游词
2015/02/02 职场文书
社区工作者个人总结
2015/02/28 职场文书
人代会简报
2015/07/21 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers