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编写检测数据库SA用户的方法
Jul 11 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
Python实现图片转字符画的示例代码
Aug 21 Python
python抽取指定url页面的title方法
May 11 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
Jul 27 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
Aug 08 Python
Django实现简单网页弹出警告代码
Nov 15 Python
Matplotlib中%matplotlib inline如何使用
Jul 28 Python
如何编写python的daemon程序
Jan 07 Python
详解python的变量缓存机制
Jan 24 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 class中public,private,protected的区别以及实例分析
2013/06/18 PHP
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
浅析Jquery操作select
2016/12/13 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
ES2020 新特性(种草)
2020/01/12 Javascript
python修改操作系统时间的方法
2015/05/18 Python
python删除文本中行数标签的方法
2018/05/31 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
社区党务公开实施方案
2014/03/18 职场文书
企业委托书范本
2014/09/13 职场文书
跑吧孩子观后感
2015/06/10 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书