python知识积累与提炼(设计模式)---观察者模式

什么是观察者模式?

摘取自百度百科:
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

观察者
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察
被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。

撤销观察
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。

开始设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Observer(object):
'''
被观察者抽象类
'''
def update(self,Subscription):
'''
被观察者提供的更新接口
'''
return
def send_content(self):
'''
获取新的数据
'''
return
class Subject(object):
'''
观察者抽象类
'''
def registerObserver(self, observer):
'''
被观察者的注册接口
'''
return
def removeObserver(self, observer):
'''
移除被观察者
'''
return
def notifyObservers(self):
'''
通知观察者
'''
return

开始继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
class PostOffice(Subject):
def __init__(self):
self.observers = []
self.Subscription = None
def registerObserver(self,observer):
'''
添加注册者
'''
self.observers.append(observer)
return None
def removeObserver(self,observer):
'''
删除注册者
'''
self.observers.remove(observer)
return None
def notifyObserver(self):
'''
更新所有注册者
'''
for observer in self.observers:
observer.update(self.Subscription)
return None
def UpdateAllObserver(self):
'''
执行更新
'''
self.notifyObserver()
def setSubscription(self,Subscription):
'''
推送
'''
self.Subscription = Subscription
self.UpdateAllObserver()
class SH_Publish(Observer):
def __init__(self,PostOffice):
self.PostOffice = PostOffice
self.Subscription = None
PostOffice.registerObserver(self)
def update(self,Subscription):
self.Subscription = Subscription
self.send_content()
return
def send_content(self):
if self.Subscription is None:
print "Shanghai Publishing have no Subscription send to you"
return None
print "this is Shanghai Pubishing ,we will send the %s to you at 2 days"%self.Subscription
class Bj_Publish(Observer):
def __init__(self,PostOffice):
self.PostOffice = PostOffice
self.Subscription = None
PostOffice.registerObserver(self)
def update(self,Subscription):
self.Subscription = Subscription
self.send_content()
return
def send_content(self):
if self.Subscription is None:
print "Beijing Publishing have no Subscription send to you"
return None
print "this is BeiJing Pubishing ,we will send the %s to you at 3 days"%self.Subscription
def client():
Post = PostOffice()
sh = SH_Publish(Post)
print "-----1-----"
sh.send_content()
print "-----2-----"
Post.setSubscription("litte red girl cookbook")
print "上海:",sh.Subscription
bj = Bj_Publish(Post)
print "-----3-----"
Post.setSubscription("The Harry Potter ")
print "上海:",sh.Subscription
print "北京:",bj.Subscription
if __name__ == "__main__":
client()

问题也来了

被观察者的对象在注册到观察者的实例的上面的时候,如果需要重新定义一个继承与观察者抽象类的另一个子类的时候,就需要更改代码了,这个工作量是很大的,如果方便快捷的更改观察者呢?