Python设计模式之观察者模式实例


Posted in Python onApril 26, 2014

关于设计模式中的观察者模式,定义如下(维基百科):

?察者模式(有?r又被??榘l布/??模式)是????模式的一?。在此?模式中,一??目?宋锛?芾硭?邢嘁漓端?挠^察者物件,?K且在它本身的??B改??r主?影l出通知。?通常透?呼叫各?察者所提供的方法????。此?模式通常被用???作事件?理系?。
简单来说,一个被观察者有很多观察者,被观察者的状态的改变会引起所有观察者的响应操作。

那么我们用Python2.7来实现观察者模式。

Python中的集合set

集合(set),类似于列表(list),但是它没有重复的元素,它的doc内容如下:

>>> print set.__doc__
set() -> new empty set object
set(iterable) -> new set object
Build an unordered collection of unique elements.

下面是在ipython中进行的几个简单的集合操作。
In [1]: myset = set()
In [2]: myset.add(1)
In [3]: myset.add(2)
In [4]: myset.add('s')
In [5]: print myset
set([1, 2, 's'])
In [6]: myset.add('s')
In [7]: print myset
set([1, 2, 's'])
In [8]: myset.remove(3)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-8-a93073f8a2af> in <module>()
----> 1 myset.remove(3)
KeyError: 3
In [9]: myset.remove(1)
In [10]: print myset
set([2, 's'])

通过内置的set()可以产生一个空的集合对象,也可以在set中传入一些参数,例如一个列表:
>>> print set([1,2,3,3])
set([1, 2, 3])

最常用的方法就是add和remove了,更多内容可以参考http://docs.python.org/2/library/stdtypes.html#set。

一个简单的观察者模式的实现

class Observer(object):
    def __init__(self, s):
        self.s = s
    def update(self):
        print self.s
if __name__ == '__main__':
    foo01 = Observer("hi, i am foo01")
    foo02 = Observer("hi, i am foo02")
    observers = set()
    observers.add(foo01)
    observers.add(foo01)
    observers.add(foo02)
    print observers
    for ob in observers:
        ob.update()

下面是运行结果:
set([<__main__.Observer object at 0xb74627cc>, <__main__.Observer object at 0xb74627ec>])
hi, i am foo01
hi, i am foo02

运行结果中第一行是集合observers的内容,其包含了两个Observer实例,这些实例所处的内存地址在每次运行时可能有不同。而
for ob in observers:
    ob.update()

就可以看成多个观察者产生响应。

当然,这种实现并不好——被观察者也应该是一个实例。

更加完善的观察者模式实现

class ObserverInterface(object):
    def __init__(self):
        pass
    def update(self):
        pass
class SubjectInterface(object):
    def __init__(self):
        self.observers = set()
    def addObserver(self, ob):
        self.observers.add(ob)
    def delObserver(self, ob):
        self.observers.remove(ob)
    def notifyObservers(self):
        for ob in self.observers:
            ob.update()
class Observer01(ObserverInterface):
    def __init__(self, s):
        self.s = s
    def update(self):
        print self.s
class Observer02(ObserverInterface):
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2
    def update(self):
        print self.num1 + self.num2
class Subject01(SubjectInterface):
    def __init__(self):
        SubjectInterface.__init__(self)
if __name__ == '__main__':
    ob01 = Observer01("hi, i am ob01")
    ob02 = Observer02("hello,","i am ob02")
    observers = set()
    sb01 = Subject01()
    sb01.addObserver(ob01)
    sb01.addObserver(ob02)
    sb01.notifyObservers()

运行结果如下:
hi, i am ob01
hello,i am ob02
Python 相关文章推荐
python中遍历文件的3个方法
Sep 02 Python
详解用python实现简单的遗传算法
Jan 02 Python
python中字符串的操作方法大全
Jun 03 Python
python单线程文件传输的实例(C/S)
Feb 13 Python
Python I/O与进程的详细讲解
Mar 08 Python
python编写简单端口扫描器
Sep 04 Python
Python面向对象之多态原理与用法案例分析
Dec 30 Python
Python轻量级web框架bottle使用方法解析
Jun 13 Python
Python Pivot table透视表使用方法解析
Sep 11 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
Python基础学习之奇异的GUI对话框
May 27 Python
python playwright 自动等待和断言详解
Nov 27 Python
Python设计模式之代理模式实例
Apr 26 #Python
python中的列表推导浅析
Apr 26 #Python
Python中的Numpy入门教程
Apr 26 #Python
Python中的map、reduce和filter浅析
Apr 26 #Python
Python实现的Kmeans++算法实例
Apr 26 #Python
爬山算法简介和Python实现实例
Apr 26 #Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 #Python
You might like
简单的php新闻发布系统教程
2014/05/09 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
javascript 打印页面代码
2009/03/24 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
js控制淡入淡出示例代码
2013/11/12 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
JavaScript是如何实现继承的(六种方式)
2016/03/31 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
python 5个顶级异步框架推荐
2020/09/09 Python
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
电子商务专业推荐信范文
2013/12/02 职场文书
教职工代表大会主持词
2014/04/01 职场文书
健康家庭事迹材料
2014/05/02 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
2014年药店店长工作总结
2014/11/17 职场文书
解除租房协议书
2014/12/03 职场文书
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android