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和Linux系统上的错误
Dec 12 Python
python 获取文件下所有文件或目录os.walk()的实例
Apr 23 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
PyTorch中常用的激活函数的方法示例
Aug 20 Python
OpenCV+face++实现实时人脸识别解锁功能
Aug 28 Python
python几种常用功能实现代码实例
Dec 25 Python
pytorch:实现简单的GAN示例(MNIST数据集)
Jan 10 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
tensorflow 查看梯度方式
Feb 04 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 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
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
php设计模式 Interpreter(解释器模式)
2011/06/26 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
php实现RSA加密类实例
2015/03/26 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
JavaScript中的闭包
2016/02/24 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
2017/02/14 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
vue组件命名和props命名代码详解
2019/09/01 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
Python实现周期性抓取网页内容的方法
2015/11/04 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
接受捐赠答谢词
2014/01/27 职场文书
教师辞职书范文
2015/02/26 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
利用Python实时获取steam特惠游戏数据
2022/06/25 Python