站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题Java模式开发之责任链模式

Java模式开发之责任链模式

摘要: 击鼓传花便是责任链模式的应用。在责任链模式里,很多的对象由每一个对象对其下家的引用而联接起来形成一条链

  从击鼓传花谈起

  击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。

  假比说,贾母、贾赦、贾政、贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链。击鼓者将花传给贾母,开始传花游戏。花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又由贾宝玉传给贾环,由贾环传回给贾母,如此往复(见下图)。当鼓声停止时,手中有花的人就得执行酒令。


图1、击鼓传花。

  击鼓传花便是责任链模式的应用。在责任链模式里,很多的对象由每一个对象对其下家的引用而联接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

  责任链可能是一条直线、一个环链甚至一个树结构的一部分。

  责任链模式的结构

  责任链模式是一种对象的行为模式,它所涉及到的角色如下:

  第一、抽象处理者(Handler)角色、定义出一个处理请求的接口;如果需要,接口可以定义出一个方法,以返回对下家的引用。下图给出了一个示意性的类图:


图2、抽象处理者角色。

  在图中的积累关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

  第二、具体处理者(ConcreteHandler)角色、处理接到请求后,可以选择将请求处理掉,或者将请 求传给下家。下图给出了一个示意性的类图。


图3、具体处理者角色。


  上图中的示意性的具体处理者ConcreteHandler类只有handleRequest()一个方法。

  责任链模式的静态类结构可见下图:  



图4、责任链模式的类图定义。

  在图中还给出了一个客户端,以便读者可以更清楚地看到责任链模式是怎样应用的。抽象处理者的示意性源代码:

<table width="100%" bgColor=#ffffff> <tr> <td>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;
  } </td></tr></table>  代码清单1、抽象处理者的源代码。

  具体处理者的示意性源代码:

<table width="100%" bgColor=#ffffff> <tr> <td>public class ConcreteHandler extends Handler
  {
   public void handleRequest()
    {
     if (getSuccessor() != null)
     {
      getSuccessor().handleRequest();
     }
     if (successor != null)
     {
      successor.handleRequest();
     }
    // Write your code here
    }
  }</td></tr></table>  代码清单2、具体处理者的源代码。

  客户端的源代码如下:

<table width="100%" bgColor=#ffffff> <tr> <td>public class Client
  {
   private Handler handler;
   public static void main(String[] args)
    {
     handler = new ConcreteHandler();
     //write your code here
    }
  } </td></tr></table>
  代码清单3、客户端的源代码。



↑返回目录
前一篇: 设计模式之Observer
后一篇: Java中利用Reflection API优化代码