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上传图片并生成缩略图方法示例
Dec 11 Python
python实现聚类算法原理
Feb 12 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
flask-restful使用总结
Dec 04 Python
Python字符串对象实现原理详解
Jul 01 Python
利用python实现逐步回归
Feb 24 Python
Python 调用有道翻译接口实现翻译
Mar 02 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
Jun 10 Python
Python map及filter函数使用方法解析
Aug 06 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 Python
python实现图像高斯金字塔的示例代码
Dec 11 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 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/10/23 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
Python设计模式之抽象工厂模式
2016/08/25 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
基于python检查矩阵计算结果
2020/05/21 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
土木工程应届生求职信
2013/10/31 职场文书
给幼儿园老师的表扬信
2014/01/19 职场文书
大雁塔导游词
2015/02/04 职场文书
新课程改革心得体会
2016/01/22 职场文书
导游词之太原天龙山
2020/01/02 职场文书
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python
Kubernetes控制节点的部署
2022/04/01 Servers
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers
springboot用户数据修改的详细实现
2022/04/06 Java/Android