1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """http://code.activestate.com/recipes/131499-observer-pattern/"""
- class Subject(object):
- 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()
|