大话设计模式Python实现-观察者模式

观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更新自己

下面是观察者模式的一个demo: 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 __author__ = 'Andy'
 5 
 6 """
 7 大话设计模式
 8 设计模式——观察者模式
 9 观察者模式又叫做发布-订阅模式 (Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更新自己
10 使用场景:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象待改变
11 """
12 
13 #抽象通知者类
14 class Subject(object):
15 
16     def attach(self, observer):
17         pass
18 
19     def detach(self,observer):
20         pass
21 
22     def notify(self):
23         pass
24 
25 
26 #具体通知者类
27 class Boss(Subject):
28 
29     def __init__(self):
30         self.observer_list = []
31         self.subject_status = ''
32 
33     def attach(self, observer):
34         self.observer_list.append(observer)
35 
36     def detach(self,observer):
37         self.observer_list.remove(observer)
38 
39     def notify(self):
40         for item in self.observer_list:
41             item.update()
42 
43 #抽象观察者类
44 class Observer(object):
45 
46     def __init__(self, name, publish):
47         self.name = name
48         self.publish = publish
49 
50     def update(self):
51         pass
52 
53 #具体观察者类-看股票的人
54 class StockObserver(Observer):
55 
56     def update(self):
57         print self.publish.subject_status,self.name,'关闭股票行情,继续工作'
58 
59 
60 #具体观察者类-看NBA的人
61 class NbaObserver(Observer):
62 
63     def update(self):
64         print self.publish.subject_status,self.name,'关闭NBA,继续工作'
65 
66 
67 if __name__ == "__main__":
68     publisher = Boss()
69     stocker = StockObserver('Andy',publisher)
70     nbaer = NbaObserver('Tracy',publisher)
71     publisher.attach(stocker)
72     publisher.attach(nbaer)
73     publisher.subject_status = '本老板回来了'
74     publisher.notify()

上面类的设计如下图:

将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性,我们不希望为了维持一致性而使各类紧密耦合,这样会给维护,扩展和重用都带来不便

观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象而不是依赖于具体,从而使得各自的变化都不影响另一边的变化

 


作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/onepiece-andy/p/python-publish-subscribe-pattern.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值