python 设计模式之观察者模式
观察者模式是一个软件设计模式,一个主题对象博包涵一系列依赖他的观察者,自动通知观察者的主题对象的改变,通常会调用每个观察者的一个方法。这个设计模式非常适用于分布式事件处理系统。
典型的在观察者模式下:
1.发布者类应该包涵如下方法:
- 注册能够接收通知的对象
- 从主对象到注册对象,通知任何变化
- 未注册对象不能够接收任何通知信息
2.订购者类应该包涵如下:
- 发布者会调用一个订购者提供的方法,将任何改变告知注册对象。
3.当一个事件会触发了状态的改变,发表者会调用通知方法
总结:订阅者可以在发布对象中注册或者不注册,如此无论什么事件发生,都会触发发布者通过调用通知方法,去通知订购者。这个通知只会在事件发生的时候,去通知已经注册的订购者。
一个简单的python实现:
让我们实现一个不同用户在TechForum 上发布技术邮件的例子,当任何用户发布一个新的邮件,其他用户就会接收到新邮件通知。从对象的角度去看,我们应该有一个 TechForum对象,我们需要有另外一些需要用户对象在TechForum上注册,当新邮件通知的时候,应该发送邮件标题。
一个简单的例子分析会联想到中介机构和雇主的关系。这就是招聘者和应聘者关系的延伸。通过一个工作中介会发布不同种类的工作信息,应聘者会去寻找相关的工作信息,招聘者也会寻找在中介注册过的应聘者。
代码如下:
classPublisher:
def__init__(self):
pass defregister(self):
pass defunregister(self):
pass defnotifyAll(self):
pass classTechForum(Publisher):
def__init__(self):
self._listOfUsers = []
self.postname = None
defregister(self, userObj):
if userObj notin self._listOfUsers:
self._listOfUsers.append(userObj) defunregister(self, userObj):
self._listOfUsers.remove(userObj) defnotifyAll(self):
for objects in self._listOfUsers:
objects.notify(self.postname) defwriteNewPost(self , postname):
self.postname = postname
self.notifyAll() classSubscriber:
def__init__(self):
pass defnotify(self):
pass classUser1(Subscriber):
defnotify(self, postname):
print"User1 notified of a new post %s" % postname classUser2(Subscriber):
defnotify(self, postname):
print"User2 notified of a new post %s" % postname classSisterSites(Subscriber):
def__init__(self):
self._sisterWebsites = ["Site1" , "Site2", "Site3"] defnotify(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设计模式之观察者模式
观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式. 观察者模式在状态检测和事件处 ...
- 最全36种python设计模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...
- python设计模式第2版
python设计模式第2版 目录 第1章 设计模式简介 1 1.1 理解面向对象编程 1 1.1.1 对象 2 1.1.2 类 2 1.1.3 方法 2 1.2 面向对象编程的主要概念 3 1.2.1 ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 设计模式之观察者模式(Observable与Observer)
设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...
- python设计模式浅析
今天简单聊聊python的设计模式,GOF设计模式(c++)和Head first design pattern(Java)是两本设计模式的经典,基本可以照搬在python上面,但是你会发现pytho ...
- 8.5 GOF设计模式四: 观察者模式Observer
GOF设计模式四: 观察者模式Observer 现实中遇到的问题 当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式 观察者模式 ...
- Python设计模式 - UML - 对象图(Object Diagram)
简介 对象图和类图的基本概念是类似的,可以看作类图在系统某一时刻的镜像,显示了该时刻系统中参与交互的各个对象以及它们之间的关系. 对象图的元素包括对象.链接.包,元素之间的关系和类图相似. 对象图建模 ...
- Python 设计模式之路
备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Python 设计模式之路(一)——设计模式 初识 Python 设计模式之路(二)——简单工厂.工厂.抽象工厂模式 ...
随机推荐
- Java的内存回收
一.java引用的种类 1.对象在内存中的状态 可达状态:当一个对象被创建后,有一个以上的引用变量指向它. 可恢复状态: 不可达状态:当对象的所有关联被切断,且系统调用所有对象的finalize方法依 ...
- HashTable, HashMap,TreeMap区别
java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类.Map是将键映射到值的对象,一个映射不能包含重复的键:每个键最多 ...
- IOS开发学习笔记028-UITableView单组数据显示代码优化
1.如果表格中又几百条数据的话,系统会自动加载显示在界面上得数据,逐一加载 添加100个数据到UITableView中 ; i < ; i ++) { NSString *icon = [NSS ...
- putty的基本使用
1.输入你要连接的目标的IP地址,输入你要给它取的名字,点击保存 2.选中你保存的会话,点击打开,即可打开会话 3.输入你连接的目标的用户账号,回车,再输入密码.即可正常使用. 4.编码的设置 在出现 ...
- Leetcode 632.最小区间
最小区间 你有 k 个升序排列的整数数组.找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中. 我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < ...
- 聊聊、Integer 封装特性
前几天在公司内部群,有人分享出了一道题,问谁能口算出来,他就膜拜那个人.题目如下: Class cache = Integer.class.getDeclaredClasses()[0]: Field ...
- Python的网络编程socket模块
(1)利用socket进行简单的链接 Python里面的socket支持UDP.TCP.以及进程间的通信,socket可以把我们想要发送的东西封装起来,发送过去,然后反解成原来的样子,事实上网路通信可 ...
- Summary—【base】(JavaScript)
1.认识Js 1.1 Js就是一门运行在客户端浏览器的脚本编程语言 1.2 组成 ECMAScript:Js的语法标准 DOM:JS操作网页 ...
- Kernel Space与User Space(转)
对于刚刚接触Linux的菜鸟来说,可能会不理解大家常说的Kernel Space和User Space是什么意思,我简单搜了一下,发现阮一峰写过一个比较简洁的介绍,贴下来给大家: 学习 Linux 时 ...
- 【bzoj1520】[POI2006]Szk-Schools 费用流
题目描述 输入 输出 如果有可行解, 输出最小代价,否则输出NIE. 样例输入 5 1 1 2 3 1 1 5 1 3 2 5 5 4 1 5 10 3 3 3 1 样例输出 9 题解 费用流 设xi ...