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实现判断数组是否包含指定元素的方法
Jul 15 Python
python实现决策树ID3算法的示例代码
May 30 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
Python3内置模块random随机方法小结
Jul 13 Python
PyQt+socket实现远程操作服务器的方法示例
Aug 22 Python
python argparser的具体使用
Nov 10 Python
Django 请求Request的具体使用方法
Nov 11 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
基于python实现地址和经纬度转换
May 19 Python
python中可以声明变量类型吗
Jun 18 Python
Python自动登录QQ的实现示例
Aug 28 Python
python中 Flask Web 表单的使用方法
May 20 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
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
Python每天必学之bytes字节
2016/01/28 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
Python实现八皇后问题示例代码
2018/12/09 Python
python日志模块logbook使用方法
2019/09/19 Python
Python实现代码统计工具
2019/09/19 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
美容院营销方案
2014/03/05 职场文书
火箭队口号
2014/06/18 职场文书
基层党支部整改方案
2014/10/25 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
美术教师个人总结
2015/02/06 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
AngularJS实现多级下拉框
2022/03/25 Javascript