设计模式-观察者模式-observer-python

来源:互联网 发布:tplink路由器访客网络 编辑:程序博客网 时间:2024/05/24 04:14

def

定义对象间一种一对多的依赖关系, 使得每当一个对象改变状态, 则所有依赖于它的对象都会得到通知并被自动更新。

usage

● 观察者和被观察者之间是抽象耦合
如此设计, 则不管是增加观察者还是被观察者都非常容易扩展, 而且在Java中都已经实现的抽象层级的定义, 在系统扩展方面更是得心应手。
● 建立一套触发机制
根据单一职责原则, 每个类的职责是单一的, 那么怎么把各个单一的职责串联成真实世界的复杂的逻辑关系呢? 比如, 我们去打猎, 打死了一只母鹿, 母鹿有三个幼崽, 因失去了母鹿而饿死, 尸体又被两只秃鹰争抢, 因分配不均, 秃鹰开始斗殴, 然后羸弱的秃鹰死掉,生存下来的秃鹰, 则因此扩大了地盘……这就是一个触发机制, 形成了一个触发链。 观察者模式可以完美地实现这里的链条形式。

code

class Subject(object):    def __init__(self):        self._observers = []    def attach(self, observer):        if observer not in self._observers:            self._observers.append(observer)    def detach(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)# Example usageclass Data(Subject):    def __init__(self, name=''):        Subject.__init__(self)        self.name = name        self._data = 0    @property    def data(self):        return self._data    @data.setter    def data(self, value):        self._data = value        self.notify()class HexViewer:    def update(self, subject):        print(u'HexViewer: Subject %s has data 0x%x' %              (subject.name, subject.data))class DecimalViewer:    def update(self, subject):        print(u'DecimalViewer: Subject %s has data %d' %              (subject.name, subject.data))# Example usage...def main():    data1 = Data('Data 1')    data2 = Data('Data 2')    view1 = DecimalViewer()    view2 = HexViewer()    data1.attach(view1)    data1.attach(view2)    data2.attach(view2)    data2.attach(view1)    print(u"Setting Data 1 = 10")    data1.data = 10    print(u"Setting Data 2 = 15")    data2.data = 15    print(u"Setting Data 1 = 3")    data1.data = 3    print(u"Setting Data 2 = 5")    data2.data = 5    print(u"Detach HexViewer from data1 and data2.")    data1.detach(view2)    data2.detach(view2)    print(u"Setting Data 1 = 10")    data1.data = 10    print(u"Setting Data 2 = 15")    data2.data = 15if __name__ == '__main__':    main()### OUTPUT #### Setting Data 1 = 10# DecimalViewer: Subject Data 1 has data 10# HexViewer: Subject Data 1 has data 0xa# Setting Data 2 = 15# HexViewer: Subject Data 2 has data 0xf# DecimalViewer: Subject Data 2 has data 15# Setting Data 1 = 3# DecimalViewer: Subject Data 1 has data 3# HexViewer: Subject Data 1 has data 0x3# Setting Data 2 = 5# HexViewer: Subject Data 2 has data 0x5# DecimalViewer: Subject Data 2 has data 5# Detach HexViewer from data1 and data2.# Setting Data 1 = 10# DecimalViewer: Subject Data 1 has data 10# Setting Data 2 = 15# DecimalViewer: Subject Data 2 has data 15