菜鸟教程中关于观察者模式的介绍如下:
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:使用面向对象技术,可以将这种依赖关系弱化。
关键代码:在抽象类里有一个 ArrayList 存放观察者们。
应用实例: 拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
以下演示如何在实际的Spring工程中使用观察者模式。
这个demo的框架如下所示,与直接实现的观察者、被观察者模式相比,可以通过中间的观察者订阅管理服务Bean,动态注册、移除观察者,被观察者状态发生变化时,会通知观察者订阅管理服务,这个服务再通知所有订阅了这个被观察者的服务。
被观察者需要继承Java自带的util包中的Observerble接口,并且调用setChange()和notifyObservers()函数通知被观察者(在这里是观察者订阅管理服务);观察者服务,需要实现Java Util包中的Observer类接口。
首先被观察者,在需要通知观察者的时候,需要调用setChange()和notifyObservers()函数通知被观察者,其中notifyObservers函数可以传参数。
init函数在Bean初始化后,将观察者订阅管理服务添加到观察者中。
然后是观察者订阅管理服务,提供观察者注册、移除功能,在观察者状态变化时,通知所有订阅了的观察者。
然后是观察者,我在观察者Bean创建成功后就在观察者订阅管理服务注册了,也可以在其他有需要的时候拿到这个bean,订阅或者移除。观察者可以拿到被观察者在notifyObservers函数传过来的参数。
重要的事情
被观察者状态发生变化后,通知到订阅管理服务,订阅管理服务再依次通知所有观察者,这个过程是阻塞的,有可能订阅的观察者非常多,或者观察者需要做一些耗时的操作,会阻塞很长的时间,所以在观察者中要采用异步的方法来避免长时间的阻塞。
原文地址:https://www.cnblogs.com/liangf27/p/11822936.html