Python观察者模式
1.概述
| 1 | 2 | 
|---|---|
| 定义 | 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 | 
| 角色 | 抽象发布者:(Subject) 具体发布者:(ConcreteSubject) 抽象观察者:(Obeserver) | 
| 优点 | 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。 | 
| 缺点 | 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化 | 
| 应用场景 | 1.信息聚合:像是微博上的相关关注 2.事件驱动系统:像是用于监听特定的事件,比如像故障诊断的告警触发 | 
2.应用案例
**需求:**实现一个数据化程序
默认情况下我们是以十进制格式展示一个数值,现在我们同时将数值转换成二进制和十六进制,当数值默认情况下的十进制法生变法的同时相应的二进制以及十六进制也会发生变化
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 抽象发布者
class Publisher:
    def __init__(self):
        self.observers = []
    def add(self, observer):
        if observer not in self.observers:
            self.observers.append(observer)
        else:
            print('Failed to add: {}'.format(observer))
    def remove(self, observer):
        try:
            self.observers.remove(observer)
        except ValueError:
            print('Failed to remove: {}'.format(observer))
    def notify(self):
        [o.update(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
    def data(self):
        return self._data
    @data.setter
    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 update(self, publisher):
        print("{}: '{}' has now hex data = {}".format(type(self).__name__, publisher.name, hex(publisher.data)))
class BinaryFormatter:
    def update(self, publisher):
        print("{}: '{}' has now bin data = {}".format(type(self).__name__, publisher.name, bin(publisher.data)))
def main():
    df = DefaultFormatter('test1')
    print(df)
    print()
    hf = HexFormatter()
    df.add(hf)
    df.data = 3
    print(df)
    print()
    bf = BinaryFormatter()
    df.add(bf)
    df.data = 21
    print(df)
    print()
    df.remove(hf)
    df.data = 40
    print(df)
    print()
    df.remove(hf)
    df.add(bf)
    df.data = 'hello'
    print(df)
    print()
    df.data = 15.8
    print(df)
if __name__ == '__main__':
    main()
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号