-- flyaflya [2005-08-04 09:24:56]
Contents
1. Observer(观察者)
1.1. 意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
1.2. 代码
1 class Subject:
2 def __init__(self):
3 self._observers = []
4
5 def attach(self, observer):
6 if not observer in self._observers:
7 self._observers.append(observer)
8
9 def detach(self, observer):
10 try:
11 self._observers.remove(observer)
12 except ValueError:
13 pass
14
15 def notify(self, modifier=None):
16 for observer in self._observers:
17 if modifier != observer:
18 observer.update(self)
1.3. 例子
1 # Example usage
2 class Data(Subject):
3 def __init__(self, name=''):
4 Subject.__init__(self)
5 self.name = name
6 self.data = 0
7
8 def setData(self, data):
9 self.data = data
10 self.notify()
11
12 def getData(self):
13 return self.data
14
15
16 class HexViewer:
17 def update(self, subject):
18 print 'HexViewer: Subject %s has data 0x%x' % (subject.name, subject.getData())
19
20
21 class DecimalViewer:
22 def update(self, subject):
23 print 'DecimalViewer: Subject %s has data %d' % (subject.name, subject.getData())
24
25
26 # Example usage...
27 def main():
28 data1 = Data('Data 1')
29 data2 = Data('Data 2')
30 view1 = DecimalViewer()
31 view2 = HexViewer()
32 data1.attach(view1)
33 data1.attach(view2)
34 data2.attach(view2)
35 data2.attach(view1)
36
37 print "Setting Data 1 = 10"
38 data1.setData(10)
39 print "Setting Data 2 = 15"
40 data2.setData(15)
41 print "Setting Data 1 = 3"
42 data1.setData(3)
43 print "Setting Data 2 = 5"
44 data2.setData(5)
45 print "Detach HexViewer from data1 and data2."
46 data1.detach(view2)
47 data2.detach(view2)
48 print "Setting Data 1 = 10"
49 data1.setData(10)
50 print "Setting Data 2 = 15"
51 data2.setData(15)
1.4. 特殊说明
- 例如:MFC中document类对所有view的更新,ddx/ddv对窗口上控件的更新。