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