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用ConfigObj读写配置文件的实现代码
Mar 04 Python
python写入已存在的excel数据实例
May 03 Python
Django框架设置cookies与获取cookies操作详解
May 27 Python
wxpython绘制圆角窗体
Nov 18 Python
Python实现打印实心和空心菱形
Nov 23 Python
pandas中ix的使用详细讲解
Mar 09 Python
python模拟哔哩哔哩滑块登入验证的实现
Apr 24 Python
Pycharm修改python路径过程图解
May 22 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
python 实现倒计时功能(gui界面)
Nov 11 Python
python中pickle模块浅析
Dec 29 Python
python读取pdf格式文档的实现代码
Apr 01 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/11/16 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
Smarty变量用法详解
2016/05/11 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
BootStrap按钮标签及基本样式
2016/11/23 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
webpack独立打包和缓存处理详解
2017/04/03 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
Python3实现从指定路径查找文件的方法
2015/05/22 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
Python可迭代对象操作示例
2019/05/07 Python
python图形开发GUI库wxpython使用方法详解
2020/02/14 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
Python 如何在字符串中插入变量
2020/08/01 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
C++:局部变量能否和全局变量重名
2014/03/03 面试题
什么是数组名
2012/05/10 面试题
小学清明节活动方案
2014/03/08 职场文书
网络优化专员求职信
2014/05/04 职场文书
公司员工安全协议书
2014/11/21 职场文书
董事长年会致辞
2015/07/29 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python