observer design pattern

Carel Fellinger cfelling at iae.nl
Tue Jan 23 18:54:09 EST 2001


D-Man <dsh8290 at rit.edu> wrote:
> On Mon, Jan 22, 2001 at 04:09:48PM -0500, Roland Schlenker wrote:
...
> | class Observer:
> |     def __init__(self):
> |         pass
> |     def update(self, theChangedSubject):
> |         pass
> [snip]

> Since Python is dynamically typed, this Observer class (or interface,
> as it should be in Java) is unnecessary since it doesn't do anything.
> It may, however, improve readability when the concrete subclass
> inherits from it.  Though maybe that just belongs in a docstring or
> comment.

Or you could give it more body like in:

class Observer:
    def __init__(self, observed, View):
	observed.attach(self, View)

    def update(self, view):
	pass

def transparantView(observed):
    return observed

class Observed:
    def __init__(self):
        self.observerList = []

    def attach(self, observer, View=transparantView):
        self.observerList.append((observer, View))

    def detach(self, observer, View=transparantView):
        self.observerList.remove((observer, View))

    def notify(self):
        for observer, View in self.observerList:
            observer.update(View(self))



#### Clock Example
if __name__ == "__main__":
    
    import time
    
                
    class ClockTimer(Observed):
        def __init__(self):
            Observed.__init__(self)
            self.localTime = time.localtime(time.time())

        def tick(self):
            while 1:
                time.sleep(1)
                self.localTime = time.localtime(time.time())
                self.notify()

    
    class ClockView:
        def __init__(self, observed):
            self.localTime = observed.localTime

        def getHour(self):
            return self.localTime[3]

        def getMinute(self):
            return self.localTime[4]

        def getSecond(self):
            return self.localTime[5]

            
    class DigitalClock(Observer):
        def __init__(self, observed, view=ClockView):
            Observer.__init__(self, observed, view)

        def update(self, view):
            print ('\rThe time is %02i:%02i:%02i' % (view.getHour(),
                                                     view.getMinute(),
                                                     view.getSecond())),
    
    timer = ClockTimer()
    digitalClock = DigitalClock(timer)
    timer.tick()
-- 
groetjes, carel



More information about the Python-list mailing list