#!/usr/bin/env python """ the observer pattern defines a one-to-many relation between objects. when the publisher changes stated, all the dependent object are notified. """ class Publisher(object): def __init__(self): self._observers = [] def register(self, observer): if not observer in self._observers: self._observers.append(observer) def unregister(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) # the publisher class Data(Publisher): def __init__(self, name=”): Publisher.__init__(self) self.name = name self.data = 0 def setData(self, data): self.data = data self.notify() def getData(self): return self.data # the viewer objects class HexDisplay(object): def update(self, publisher): print( 'HexDisplay: Publisher %s has data 0x%x' % (publisher.name, publisher.getData())) class DecimalDisplay(object): def update(self, publisher): print( 'DecimalDisplay: Publisher %s has data %d' % (publisher.name, publisher.getData())) def main(): data1 = Data('Data 1') data2 = Data('Data 2') display1 = DecimalDisplay() display2 = HexDisplay() data1.register(display1) data1.register(display2) data2.register(display2) data2.register(display1) print( "Setting Data 1 = 10") data1.setData(10) print( "Unregister HexDisplay from data1 and data2.") data1.unregister(display2) data2.unregister(display2) print( "Setting Data 1 = 10") data1.setData(10) print( "Setting Data 2 = 15") data2.setData(15) if __name__ == '__main__': main()