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 查找文件夹下所有文件 实现代码
Jul 01 Python
python利用正则表达式提取字符串
Dec 08 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
Jan 29 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
python制作mysql数据迁移脚本
Jan 01 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 Python
YUV转为jpg图像的实现
Dec 09 Python
Python定义一个函数的方法
Jun 15 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
Python如何急速下载第三方库详解
Nov 02 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
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
php邮件发送的两种方式
2020/04/28 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
php链式操作的实现方式分析
2019/08/12 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
2020/03/23 PHP
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
Python与R语言的简要对比
2017/11/14 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
python 拼接文件路径的方法
2018/10/23 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
Python持续监听文件变化代码实例
2020/07/22 Python
Python hashlib模块的使用示例
2020/10/09 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
学年自我鉴定范文
2013/10/01 职场文书
优秀毕业生求职信范文
2014/01/02 职场文书
给女儿的表扬信
2014/01/18 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
婚礼父母答谢词
2015/01/04 职场文书
年度考核个人总结
2015/03/06 职场文书
Python Django模型详解
2021/10/05 Python