class Observer(object): def __init__(self, subject): self.Subject = subject self.Subject.Attach(self) def __del__(self): self.Detach() def Detach(self): self.Subject.Detach(self) def Update(self): raise NotImplementedError class Subject(object): def __init__(self): self.Observers = {} def Attach(self, observer): self.Observers[observer] = None def Detach(self, observer): if observer in self.Observers: del self.Observers[observer] # FIXME: how to handle different classes of observers? def NotifyObservers(self): # for o in self.Observers: # <- not robust iteration! observers = self.Observers.keys() for o in observers: o.Update() class Prototype(object): def Clone(self): raise NotImplementedError class CallbackObserver(Observer): def __init__(self, subject, callback): Observer.__init__(self, subject) self.callback = callback self.args = None def Update(self): self.callback(self)