观察者模式
在应用中,当某对象状态改变的后要通知到一个或多个第三方观察者对象。这种场景就是典型的状态改变的对象和观察者对象的依赖关系场景,如何设计能尽可能的把状态改变的对象和第三方观察者对象们的耦合关系进行解耦和呢?
解决思路
分析后我们已经提炼出了这是被观察者(状态改变的对象)和观察者(第三方观察者对象们)的耦合关系。
我们希望每当被观察者状态改变时就能调用观察者的一个处理方法,这时需要被观察者能够接受外部观察者的处理方法,而这个接受或者说绑定过程由于被观察者事先不知道也不需要知道观察者对象到底是谁以及处理方法是什么样的,所以最好是推迟到观察者需要监视被观察者的改变的时候。推迟绑定的目的就是让被观察者成为不依赖于观察者的独立组件。
思路再演进,为了实现不依赖外部而成为独立构件的目标,我们可以为被观察者定义一个容器,外部谁需要要监视我的改变并做出处理时就丢给我一个处理方法,等我的状态改变时我来调用你丢给我的这个处理方法。也就是说这个容器应该能盛放一些外部对象传进来的方法,并且容器里的方法列表可以由外部新增也可以移除就更方便了。
有了前面的准备后,对于被观察者而言只需要当自己的状态改变时就从容器里取出方法并一一执行。由于这些方法就是外部观察者赋予的所以也就达成了通知外部观察者对象并执行他们需要的处理过程的目标。
至此,被观察者与观察者的依赖关系就被成功的解耦出来,变成了一种我(被观察者)不需要知道你们(观察者们)的存在,但是当你们需要监视我的变化并做出处理时我能够调用你们的处理方法的松散依赖关系。
核心:把一对多的通知依赖关系抽象出来使之成为稳定的部分来应对未知观察者对象及其处理方法的富于变化的不确定性。
在.net语言当中的事件订阅模型就是一种典型的观察者模式,但是观察者模式的实现方案不限于此,也可以是其他的比如事件总线机制。
观察者模式的官方定义
定义一种对象间的一对多的依赖关系,当对象状态发生改变时,所有依赖于它的对象都能得到通知并更新。
图片引用自李建忠老师的视频教学《C++设计模式》