观察者模式概念:

       观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。  一般这种情况应用于发布订阅功能。

案例一

         我们首先定义一个出版者Publisher(真正的发布,我们让DefaultFormatter做)。里面有三种方法:add()用于添加观察者, remove()用于删除观察者,notify()是通知,不同的对象传进来,调用的是不同的通知(观察者中有通知的方法,本质是观察者自己通知自己)。 然后载定义了三个观察者:DefaultFormatter, HexFormatter,BinFormatter。 我们让DefaultFormatter观察者继承Publisher,其他的不让继承。 DefaultFormatter的权利比那两个的权利大,DefaultFormatter可以指定值(发布的内容),也可以添加观察者,删除观察者。一旦你给data赋值,相当于调用的@data.setter装饰的data()方法。然后就会通知其他观察者。

class Publisher:
    def __init__(self):
        self.observers = []

    def add(self, observer):
        if observer not in self.observers:
            self.observers.append(observer)
        else:
            print('添加{}失败了.'.format(observer))

    def remove(self, observer):
        try:
            self.observers.remove(observer)
        except ValueError:
            print('移出{}失败了.'.format(observer))

    def notify(self):
        [o.notify(self) for o in self.observers]

class DefaultFormatter(Publisher):
    def __init__(self, name):
        Publisher.__init__(self)
        self.name = name
        self._data = 0

    def __str__(self):
        return "{}: '{}' has data = {}".format(type(self).__name__, self.name, self._data)

    @property    # 用data 代替 data()方法
    def data(self):
        return self._data

    @data.setter   # 为了方便给_data赋值,因为_data私有,我们现在给data赋值相当于给_data赋值
    def data(self, new_value):
        try:
            self._data = int(new_value)
        except ValueError as e:
            print("Error: {}".format(e))
        else:
            self.notify()

class HexFormatter:

    def notify(self, publisher):
        print("{}: '{}' has now hex data = {}".format(type(self).__name__, publisher.name, hex(publisher.data)))


class BinFormatter:

    def notify(self, publisher):
        print("{}: '{}' has now bin data = {}".format(type(self).__name__, publisher.name, bin(publisher.data)))

if __name__ == '__main__':
    df = DefaultFormatter('test1')
    print(df)

    print()
    hf = HexFormatter()
    df.add(hf)    # 把hf加入到通知列表中
    df.data = 3  # 给DefaultFormatter中的_data赋值为3,然后就会通知其他观察者
    print(df)

    print()
    bf = BinFormatter()
    df.add(bf)
    df.data = 40
    print(df)

    print()
    df.remove(hf)
    df.data = 80
    print(df)

输出结果: