欢迎来到天天文库
浏览记录
ID:37852747
大小:17.50 KB
页数:4页
时间:2019-06-01
《JDK Observer设计模式之研究》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JDKObserver设计模式之研究目前设计模式的介绍性文章越来越多,但设计模式的研究性文章仍然比较欠缺,这着实让人觉得有点遗憾。本文旨在抛砖引玉,具体分析一下java中jdk自带的observer设计模式(下文如没特别指出,observer设计模式就意指java中jdk自带的observer设计模式)的实现。1.Observer设计模式概要Observer设计模式在GOF里属于行为设计模式。JDK里提供的observer设计模式的实现由java.util.Observable类和java.util.Observer接口组成。从名字上可以清楚的
2、看出两者在Observer设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。Observable是一个封装subject基本功能的类,比如注册observer(attach功能),注销observer(detatch功能)等。这些功能是任何一个扮演observerable角色的类都需要实现的,从这一点上来讲,JDK里将这些通用功能专门封装在一个类里,显得合情合理。通常情况下,我们的类只要从Observerable类派生就可以称为observerable角色类,使用非常简单。2.使用o
3、bserver设计模式存在的困难但我们不得不注意到,在项目实际开发当中,情况往往要复杂得多。java不支持多继承特性在很多时候是阻碍我们使用observer设计模式的绊脚石。比如说,我们设计的一个类已经是某个类的派生类,在这种情况下同时想让它扮演observerable角色将变得麻烦。如何实现“多继承”的效果是摆在我们面前的一大难题。下面我们首先分析一下Observable类。3.Observable类“触发通知”的原理Observable必须“有变化”才能触发通知observer这一任务,这是它的本质体现。查看源码便可知一二。Observer
4、able部分源码如下://……省略……privatebooleanchanged=false;//……省略……publicvoidnotifyObservers(Objectarg){//……省略……Object[]arrLocal;synchronized(this){//……省略……if(!changed)return;arrLocal=obs.toArray();clearChanged();}//……省略……protectedsynchronizedvoidsetChanged(){changed=true;}protectedsync
5、hronizedvoidclearChanged(){changed=false;}正如粗的斜体标注部分所示,在notifyObservers(Objectarg)方法里if(!changed)return;语句告诉我们,若changed属性值为false,将直接返回,根本不会触发通知操作。并且我们注意到changed属性被初始化为false,这将意味着如果我们不主动设置changed属性为true,将不会有任何变化,也就是说根本起不到“通知”作用。因此,设置changed属性的值是我们应用jdkobserver设计模式的关键所在。那么如何才能
6、设置changed属性呢?从源码可以看出,唯一的入口是通过setChanged()。下面我们分析一下changed属性及相关的方法setChanged()和clearChanged()。4.Observable类的分析Observable#changed属性的初始值为false,这很容易理解,不再详细陈述。细心的读者可能会注意到跟changed属性有关的两个方法setChanged()和clearChanged(),它们的修饰符都是protected。想强调的是,是protected,而不是public。但这样是否有其必要性和合理性?答案是肯定
7、的。在前面的分析中,我已经提到,setChanged()方法是设置changed的唯一入口,它的修饰符定义为protected,就意味着通过定义Observable的对象,再设置changed属性将变得不可能。从这个意义上说,要想应用observer设计模式,必须继承Observable类方可。关于这一点,下文还会提及。但是,为什么不能定义成public?这似乎难以理解。因为定义成public,我们不就可以很方便地设置changed属性的值吗?为了弄清楚这个问题,我们还是看一下Observable里的相关的代码://……省略……publicvo
8、idnotifyObservers(Objectarg){//……省略……for(inti=arrLocal.length-1;i>=0;i--)((
此文档下载收益归作者所有