1 注册时候Obsever Pattern需要使用Observer实例的引用,而Event Pattern则是使用一个方法作为EventHandler。打个比方,如果假设你是一个Observer,在Obsever Pattern中你得把自己全给搭上(Subject保有对你的引用),而Event Pattern就只是需要你的一个联系方式(EventSource只是保有你的其中一个方法的地址)。2 Obsever Pattern中Subject依赖于Observer的接口,而Event Pattern中仅仅是依赖一个Delegate。
def __init__(self):
self.__handlers = []
def __iadd__(self, handler):
self.__handlers.append(handler)
return self
def __isub__(self, handler):
self.__handlers.remove(handler)
return self
def fire(self, *args, **keywargs):
for handler in self.__handlers:
handler(*args, **keywargs)
class EventSource(object):
def __init__(self, value):
self.modified = EventHook()
self.__value = value
def changeValue(self, value):
if self.__value != value:
oldValue = self.__value
self.__value = value
self.modified.fire(value, oldValue, type = "ChangeValue")
class EventSubscriber(object):
def __init__(self, name):
self.__name = name
def handler(self, *args, **keywargs):
print self.__name + " got: " + str(args) + str(keywargs)
if __name__ == "__main__":
data = EventSource(10)
console = EventSubscriber("Cosole")
graphic = EventSubscriber("Graphic")
data.modified += console.handler
data.modified += graphic.handler
print "Source change value to 20"
data.changeValue(20)
print "Source is still 20"
data.changeValue(20)