-- flyaflya [2005-08-04 09:24:56]

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对窗口上控件的更新。