岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Java >> 高级技术 >> 设计模式 >> Java正文
Java模式开发之责任链模式(上)
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-7-22 17:49:13

  从击鼓传花谈起
  击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。
  假比说,贾母、贾赦、贾政、贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链。击鼓者将花传给贾母,开始传花游戏。花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又由贾宝玉传给贾环,由贾环传回给贾母,如此往复(见下图)。当鼓声停止时,手中有花的人就得执行酒令。
   
  图1、击鼓传花。
  击鼓传花便是责任链模式的应用。在责任链模式里,很多的对象由每一个对象对其下家的引用而联接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
  责任链可能是一条直线、一个环链甚至一个树结构的一部分。
  责任链模式的结构
  责任链模式是一种对象的行为模式,它所涉及到的角色如下:
  第一、抽象处理者(Handler)角色、定义出一个处理请求的接口;如果需要,接口可以定义出一个方法,以返回对下家的引用。下图给出了一个示意性的类图:
   
  图2、抽象处理者角色。
  在图中的积累关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
  第二、具体处理者(ConcreteHandler)角色、处理接到请求后,可以选择将请求处理掉,或者将请 求传给下家。下图给出了一个示意性的类图。
   
   图3、具体处理者角色。
  上图中的示意性的具体处理者ConcreteHandler类只有handleRequest()一个方法。
  责任链模式的静态类结构可见下图:
   
  图4、责任链模式的类图定义。
  在图中还给出了一个客户端,以便读者可以更清楚地看到责任链模式是怎样应用的。抽象处理者的示意性源代码:
  public class Handler
   {
  public void handleRequest()
   {
  if (successor != null)
     {
       successor.handleRequest();
      }
   // Write your code here
    }
  public void setSuccessor(Handler successor)
    {
     this.successor = successor;
    }
  public Handler getSuccessor()
   {
    return successor;
   }
  private Handler successor;
  } 
  代码清单1、抽象处理者的源代码。
  具体处理者的示意性源代码:
  public class ConcreteHandler extends Handler
  {
   public void handleRequest()
    {
  if (getSuccessor() != null)
     {
  getSuccessor().handleRequest();
     }
   if (successor != null)
     {
      successor.handleRequest();
     }
    // Write your code here
    }
  }
  代码清单2、具体处理者的源代码。
  客户端的源代码如下:
  public class Client
  {
   private Handler handler;
   public static void main(String[] args)
    {
     handler = new ConcreteHandler();
     //write your code here
    }
  } 
  代码清单3、客户端的源代码。
  纯的与不纯的责任链模式
  一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,二是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。
  在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接受;在一个不纯的责任链模式里面,一个请求可以最终不被任何接受端对象所接受。
  纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的;但是在实际的系统里,纯的责任链很难找到;如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大的意义了。
  Java1.0版的AWT事件处理机制
  Java的1.0版中AWT库使用了责任链模式和命令模式来处理GUI的事件。由于视窗部件往往处在容器部件里面,因此当事件发生在一个部件上时,此部件的事件处理器可以处理此事件,然后决定是否将事件向上级容器部件传播;上级容器部件接到事件后可以在此处理此事件然后决定是否将事件再次向上级容器部件传播,如此往复,直到事件到达顶层部件。
  事件浮升机制
  比如,当一个视窗部件接到一个MOUSE_CLICKED事件时,事件首先传播到它所发生的部件上,然后向其容器部件传播。容器可以选择处理这个事件,或者再将此事件向更高一级的容器部件传播。事件如此一级级地向上传播,就像水底的气泡一点一点地冒到水面上一样,因此又叫做事件浮升(Event Bubbling)机制。下面就是一段典型的Java1.0版的AWT库里处理事件的代码:
  public boolean action(Event event, Object obj)
  {
    if (event.target == btnOK)
     {
      doOKBtnAction();
     }
  else if (event.target == btnExit)
     {
      doExitBtnAction();
     }
    else
     {
      return super.action(event, obj);
     }
    return true;
  } 
  代码清单4、Java1.0版本中AWT处理事件的典型代码。
  在这段代码里面,action()判断目标部件是不是btnOK或btnExit;如果是,便运行相应的方法;如果不是,便返还true。一个方法返还true便使得事件停止浮升。
  AWT1.0的事件处理的模型的缺点之一
  AWT1.0的事件处理的模型是基于继承的。为了使一个程序能够捕捉GUI

[1] [2] 下一页


  • 上一个Java:
  • 下一个Java:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    传世私服 传奇世界私服 天龙八部私服 bet365 传世私服 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365