行为型模式(三):观察者模式
小型WEB项目,上传给服务器文件,要显示上传进度,这个模式解决了当时的问题
定义:(又被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式)。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。用来实作事件处理系统。
一个目标的物件(类),管理依赖于它的观察者类,自己状态变化时,主动发出通知。
img被观察者类(Observable)只关联了Observer列表,状态变化notifyObservers()通知Observer,Observer是什被观察者不需要知道。
将观察者和被观察者二者的耦合度降低
img img下面是被观察者,有一个观察者的列表,通知所有观察者的方法,通知的方式就是调用观察者通用的接口行为update方法:
方法1:给客户端一个添加观察者的公共接口 方法2:同时通知观察者们,
img img img小说网站,读者订阅作者,明显的观察者模式
JDK中观察者接口:
img被观察者类:
img img被观察者除了一点同步的地方需要特殊解释一下,其余的相信各位都能看明白各个方法的用途。其实上述JDK的类是有漏洞的,或者说,在我们使用观察者模式时要注意一个问题,就是notifyObservers这个方法中的这一段代码。
img在循环遍历观察者让观察者做出响应时,JDK没有去抓取update方法中的异常,所以假设在这过程中有一个update方法抛出了异常,那么剩下还未通知的观察者就全都通知不到了,所以LZ个人比较疑惑这样的用意(LZ无法想象JAVA类库的制造者没考虑到这个问题),是sun当时真的忘了考虑这一点,还是另有它意?当然各位读者如果有自己的见解可以告知LZ,不过LZ认为,不管是sun如此做是别有用意,还是真的欠考虑,我们都要注意在update方法里一定要处理好异常,个人觉得JDK中比较保险的做法还是如下这样。
img无论其中任何一个update是否成功都不会影响其余的观察者进行更新状态,我们自己比较保险的做法就是给update方法整个加上try块,或者确认不会发生运行时异常。
小说网的例子
img img管理器帮我们管理这些作者
img img img