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中给List添加元素的4种方法分享
Nov 28 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
Feb 18 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
Python中利用aiohttp制作异步爬虫及简单应用
Nov 29 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
Python实现的微信支付方式总结【三种方式】
Apr 13 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
python实现滑雪者小游戏
Feb 22 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
Python代码中如何读取键盘录入的值
May 27 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设置编码格式的方法
2013/03/05 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
2015/03/02 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
json数据的列循环示例
2013/09/06 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
js面向对象的写法
2016/02/19 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
关于vue面试题汇总
2018/03/20 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
Python实现选择排序
2017/06/04 Python
分享vim python缩进等一些配置
2018/07/02 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
医学专业五年以上个人求职信
2013/12/03 职场文书
创业女性典型材料
2014/05/02 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android
JavaScript的function函数详细介绍
2021/11/20 Javascript
golang连接MySQl使用sqlx库
2022/04/14 Golang