123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- '''http://code.activestate.com/recipes/131499-observer-pattern/'''
- class Subject:
- def __init__(self):
- self._observers = []
- def attach(self, observer):
- if not observer in self._observers:
- self._observers.append(observer)
- def detach(self, observer):
- try:
- self._observers.remove(observer)
- except ValueError:
- pass
- def notify(self, modifier=None):
- for observer in self._observers:
- if modifier != observer:
- observer.update(self)
- # Example usage
- class Data(Subject):
- def __init__(self, name=''):
- Subject.__init__(self)
- self.name = name
- self._data = 0
- @property
- def data(self):
- return self._data
-
- @data.setter
- def data(self, value):
- self._data = value):
- self.notify()
- class HexViewer:
- def update(self, subject):
- print('HexViewer: Subject %s has data 0x%x' %
- (subject.name, subject.data))
- class DecimalViewer:
- def update(self, subject):
- print('DecimalViewer: Subject %s has data %d' %
- (subject.name, subject.data))
- # Example usage...
- def main():
- data1 = Data('Data 1')
- data2 = Data('Data 2')
- view1 = DecimalViewer()
- view2 = HexViewer()
- data1.attach(view1)
- data1.attach(view2)
- data2.attach(view2)
- data2.attach(view1)
- print("Setting Data 1 = 10")
- data1.data(10)
- print("Setting Data 2 = 15")
- data2.data(15)
- print("Setting Data 1 = 3")
- data1.data(3)
- print("Setting Data 2 = 5")
- data2.data(5)
- print("Detach HexViewer from data1 and data2.")
- data1.detach(view2)
- data2.detach(view2)
- print("Setting Data 1 = 10")
- data1.data(10)
- print("Setting Data 2 = 15")
- data2.data(15)
- if __name__ == '__main__':
- main()
|