1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- '''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
- def setData(self, data):
- self.data = data
- self.notify()
- def getData(self):
- return self.data
- class HexViewer:
- def update(self, subject):
- print('HexViewer: Subject %s has data 0x%x' % (subject.name, subject.getData()))
- class DecimalViewer:
- def update(self, subject):
- print('DecimalViewer: Subject %s has data %d' % (subject.name, subject.getData()))
- # 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.setData(10)
- print("Setting Data 2 = 15")
- data2.setData(15)
- print("Setting Data 1 = 3")
- data1.setData(3)
- print("Setting Data 2 = 5")
- data2.setData(5)
- print("Detach HexViewer from data1 and data2.")
- data1.detach(view2)
- data2.detach(view2)
- print("Setting Data 1 = 10")
- data1.setData(10)
- print("Setting Data 2 = 15")
- data2.setData(15)
- if __name__ == '__main__':
- main()
|