当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

JDK Observer筹划情势研究[Java编程]

赞助商链接



  本文“JDK Observer筹划情势研究[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

目前计划情势的介绍性文章越来越多,但计划情势的研究性文章仍旧对比欠缺,这着实让人认为有点遗憾.本文旨在举一反三,具体解析一下java中jdk自带的observer计划情势(下文如没分外指出,observer计划情势就意指java中jdk自带的observer计划情势)的实现.

1.Observer计划情势概要

Observer计划情势在GOF里属于行为计划情势.JDK里供应的observer计划情势的实现由java.util.Observable类和java.util.Observer接口构成.从名字上可以清楚的看出二者在Observer 计划情势中辨别扮演的角色:Observer是察看者角色,Observable是被察看目标(subject)角色.

Observable是一个封装subject基本功效的类,比方注册observer(attach功效),注销observer(detatch功效)等.这些功效是任何一个扮演observerable角色的类都需求实现的,从这一点上来说,JDK里将这些通勤奋效专门封装在一个类里,显得合情公道.普通情形下,我们的类只要从Observerable类派生便可以称为observerable角色类,利用非常简单.

2.利用observer计划情势存在的艰难

但我们不得不注意到,在项目实际开辟当中,情形常常要复杂得多.java不支持多担当特点在很多时刻是阻碍我们利用observer计划情势的绊脚石.比方说,我们计划的一个类已经是某个类的派生类,在这种情形下同时想让它扮演observerable角色将变得麻烦.若何实现“多担当”的效果是摆在我们眼前的一大难题.下面我们首先解析一下Observable类.

3.Observable类“触发告诉”的原理

Observable必须“有改变”才能触发告诉observer这一任务,这是它的本质表现.查看源码便可知一二.Observerable部份源码以下:

//……省略……
   private boolean changed = false;
   //……省略……
   public void notifyObservers(Object arg) {
   //……省略……
     Object[] arrLocal;
     synchronized (this) {
      //……省略……
      if (!changed)
       return;
       arrLocal = obs.toArray();
       clearChanged();
     }
   //……省略……
   protected synchronized void setChanged() {
    changed = true;
   }

   protected synchronized void clearChanged() {
    changed = false;
   }

正如粗的斜体标注部份所示,在notifyObservers(Object arg) 办法里if (!changed) return;语句奉告我们,若changed属性值为false,将直接返回,根本不会触发告诉操作.并且我们注意到changed 属性被初始化为false,这将意味着假如我们不主动设置changed属性为true,将不会有任何改变,也就是说根本起不到“告诉”作用.因此,设置changed属性的值是我们利用jdk observer 计划情势的关键所在.那么若何才能设置changed属性呢?从源码可以看出,唯一的进口是通过setChanged().下面我们解析一下changed属性及相关的办法setChanged()和clearChanged().

4.Observable类的解析

Observable#changed属性的初始值为false,这很简单理解,不再具体报告.细心的读者大概会注意到跟changed属性有关的两个办法setChanged()和clearChanged(),它们的修饰符都是protected.想夸大的是,是protected,而不是public.但这样能否有其必要性和公道性?答案是必定的.在前面的解析中,我已经提到,setChanged()办法是设置changed的唯一进口,它的修饰符定义为protected,就意味着通过定义Observable的对象,再设置changed属性将变得不大概.从这个意义上说,要想利用observer计划情势,必须担当Observable类方可.关于这一点,下文还会说起.但是,为什么不能定义成public?这仿佛难以理解.因为定义成public,我们不便可以很便利地设置changed属性的值吗?为了弄清楚这个问题,我们还是看一下Observable里的相关的代码:

//……省略……
   public void notifyObservers(Object arg) {
   //……省略……
    for (int i = arrLocal.length-1; i>=0; i--)
     ((Observer)arrLocal[i]).update(this, arg);
   }
    

这段代码表达的意思是说找出全部已注册的Observer,再一一举行“告诉”,通过调用Observer#update(Observable,Object)办法举行告诉.我们看到,update 第一个参数是this,我们同时还必须注意到,这段代码是Observable类里的代码.这就相当于是在频频夸大,发出“告诉”的,必须是observable自己(Observable类大概其派生类),别的任何类都不行.这就意味着我们的observable类担当Observable类是必要的,因为假如不担当,而采取组合的话,将无法保证能传送好this.换句话说,采取组合的方法利用Observable类,将变得几近没有任何意义.同时,修饰符定义为protected,可以确保是在Obsrvable里举行触发告诉的,不会在别的任何地方举行告诉,这显得内敛性很强.假如将setChanged()修饰符定义为public,将无法保证精确“传送this”的硬性要求,这不符合“只有observalbe才能直接或间接告诉observer”这一observable计划情势的硬性要求.由此我们可见一斑,jdk的很多理念的思惟性是多么的强.


  以上是“JDK Observer筹划情势研究[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • Ubuntu10.10配置JRE、JDK、Eclipse
  • Ubuntu系统下手动安装JDK
  • Java初学者如安在电脑上成功安装JDK
  • java JDK安装以及切确设置CLASSPATH系统变量
  • <b>CentOS下Tomcat 5.5 与 jdk1.6安装</b>
  • JDK 1.5编译中的一个独特问题
  • <b>JDK 1.6的jrunscript.exe用处</b>
  • Jdk5.0新特点Generic Types(泛型)
  • JDK6新特点:脚本语言支持(Scripting)
  • 操作JDK1.5新工具举行系统性能监测
  • <b>JDK5新特点之新的格局化输出</b>
  • JDK6.0的新特点:轻量级Http Server
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .