Observer

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