观察者模式

定义

关注于对象的行为,观察对象的状态。当对象状态发生变化时,通知他所维护的所有观察者。

用途

  • 实现对象一对多的依赖关系,当对象发生改变时,通知所有观察者。
  • 封装了主题对象的核心组件。
例如:新闻机构框架。多个用户都关注了同一个新闻对象,当有新的新闻出现时,新闻对象会推送给所有订阅该新闻的人。
同时,订阅者(观察者)并不需要知道新闻机构核心组件是什么。

优点

  • 对象之间互为松耦合。
  • 可以在无需介入或修改对象即可发送状态变化到所有观察者。
  • 观察者可以随时添加或删除。

缺点

  • 观察者接口必须由观察者实现。
  • 复杂度上升。
  • 在大型软件中,通知有可能不可靠,不一致。

示例:

1. 观察者模式

通过对子系统的功能进行封装,最后向外仅提供一个简单明了的调用接口。

>>> class Subject(object):
        def __init__(self):
            # 观察者注册的列表
            self.__observers = []
            
        def register(self, observer):
            self.__observers.append(observer)
            print("添加新观察者!%s" % type(observer).__name__)
           
        def notifyAll(self, *args, **kwargs):
            # “通知“所有观察者由 for 枚举观察者注册列表完成。
            # 通知后的“行为”由观察者自己的方法完成observer.notify()
            for observer in self.__observers:
                observer.notify(self, *args, **kwargs)
                
>>> class Observer1(object):
        def __init__(self, subject):
            # 向被观察对象注册
            subject.register(self)
        
        def notify(self, subject, *args):
            print("%s 从对象 %s 处 得到通知:%s" %    \
            (type(self).__name__, type(subject).__name__, args))
            
>>> class Observer2(object):
        def __init__(self, subject):
            # 向被观察对象注册
            subject.register(self)
        
        def notify(self, subject, *args):
            print("%s 从对象 %s 处 得到通知:%s" %\
            (type(self).__name__, type(subject).__name__, args))

>>> subject = Subject()

>>> observer1 = Observer1(subject)
添加新观察者!Observer1

>>> subject.notifyAll("新闻1!") 
Observer1 从对象 Subject 处 得到通知:('新闻1!',)

>>> observer2 = Observer2(subject)
添加新观察者!Observer2

>>> subject.notifyAll("新闻2!") 
Observer1 从对象 Subject 处 得到通知:('新闻2!',)
Observer2 从对象 Subject 处 得到通知:('新闻2!',)