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实现划词翻译
Apr 23 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
Python zip()函数用法实例分析
Mar 17 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
Apr 21 Python
python提取包含关键字的整行数据方法
Dec 11 Python
python用plt画图时,cmp设置方法
Dec 13 Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 Python
Python 一键制作微信好友图片墙的方法
May 16 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
Jun 11 Python
django教程如何自学
Jul 31 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 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
cmd下运行php脚本
2008/11/25 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
php支付宝接口用法分析
2015/01/04 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
js文件中调用js的实现方法小结
2009/10/23 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
JS定义网页表单提交(submit)的方法
2015/03/20 Javascript
javascript实现淘宝幻灯片广告展示效果
2015/04/27 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
js+canvas绘制图形验证码
2020/09/21 Javascript
[00:35]DOTA2上海特级锦标赛 EG战队宣传片
2016/03/04 DOTA
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python 多维List创建的问题小结
2019/01/18 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
应届毕业生个人求职信范文
2014/01/29 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
校庆筹备方案
2014/03/30 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
写给老师的保证书
2015/05/09 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
MySQL系列之二 多实例配置
2021/07/02 MySQL
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记