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 相关文章推荐
详解Django中的权限和组以及消息
Jul 23 Python
Python对文件操作知识汇总
May 15 Python
Python实现GUI学生信息管理系统
Apr 05 Python
Pandas 按索引合并数据集的方法
Nov 15 Python
numpy基础教程之np.linalg
Feb 12 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
python内存动态分配过程详解
Jul 15 Python
使用Bazel编译TensorBoard教程
Feb 15 Python
如何理解python对象
Jun 21 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 Python
python 管理系统实现mysql交互的示例代码
Dec 06 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
基于mysql的论坛(7)
2006/10/09 PHP
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
php生成html文件方法总结
2014/12/01 PHP
joomla数据库操作示例代码
2016/01/06 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
php swoft框架实例用法
2020/12/22 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
python自动化报告的输出用例详解
2018/05/30 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
python轮询机制控制led实例
2020/05/03 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
教师爱岗敬业演讲稿
2014/05/05 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
尊师重教主题班会
2015/08/14 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL
使用feign服务调用添加Header参数
2021/06/23 Java/Android