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实现socket端口重定向示例
Feb 10 Python
python3简单实现微信爬虫
Apr 09 Python
深入了解Python数据类型之列表
Jun 24 Python
ansible作为python模块库使用的方法实例
Jan 17 Python
老生常谈Python序列化和反序列化
Jun 28 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
数据清洗--DataFrame中的空值处理方法
Jul 03 Python
python实现flappy bird游戏
Dec 24 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
Pandas读取csv时如何设置列名
Jun 02 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
Python基础之常用库常用方法整理
Apr 30 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基础陷阱题(变量赋值)
2012/09/12 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
把textarea中字符串里含有的回车换行替换成&amp;lt;br&amp;gt;的javascript代码
2007/04/20 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
详谈js模块化规范
2017/07/07 Javascript
webpack3之loader全解析
2017/10/26 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
ES6 let和const定义变量与常量的应用实例分析
2019/06/27 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
打开电脑上的QQ的python代码
2013/02/10 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
详解Python sys.argv使用方法
2019/05/10 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
sklearn+python:线性回归案例
2020/02/24 Python
python 如何在测试中使用 Mock
2021/03/01 Python
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
离婚协议书应该怎么写
2014/10/12 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
Python之matplotlib绘制折线图
2022/04/13 Python