#!/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()