网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.基于JAVAMAIL包的邮件发送程序--.
.深入浅出Java多线程程序设计.doc.
.用SWING组件实现登录对话框.
.使用Ant协助开发Java项目.
.java与c/c++进行socket通信的一些.
.在Java程序中实现对数字的格式化.
.java程序的递归算法,列出某个目.
.利用 Velocity 模板引擎制作网站.
.Java的秘密:使用全屏幕模式.
.jive 2.6.2安装指南.
.eclipse-SDK-3.0.1-win32.
.一个浏览图片程序.
.Java的移位运算符.
.J2EE体系结构设计(2).
.JAVA加密解密---自定义类加载器应.
.循速渐进学用Session Bean(四).
.JavaMail常见问题之一般问题.
.关于GUI界面的布局与建立.
.Visual Basic串口通讯调试方法.
.arguments 属性.

JDK Observer设计模式之研究

发表日期:2008-1-5



  目前设计模式的介绍性文章越来越多,但设计模式的研究性文章仍然比较欠缺,这着实让人觉得有点遗憾。本文旨在抛砖引玉,具体分析一下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()。 QQRead.com 推出数据恢复指南教程 数据恢复指南教程 数据恢复故障解析 常用数据恢复方案 硬盘数据恢复教程 数据保护方法 数据恢复软件 专业数据恢复服务指南
  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)方法进行通知。
上一篇:如何优化JAVA程序设计和编码,提高JAVA性能 人气:803
下一篇:Taglib原理和实现之El表达式和JSTL标签 人气:750
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐