Chinaunix首页 | 论坛 | 博客
  • 博客访问: 703800
  • 博文数量: 147
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1725
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-22 10:36
文章分类

全部博文(147)

文章存档

2011年(1)

2010年(1)

2009年(35)

2008年(110)

我的朋友

分类: Java

2008-12-03 16:38:11

定义如下:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

责任链模式由两个角色组成:

  1) 处理者角色(Handler):它定义了一个处理请求的。当然对于链子的不同实现,也可以在这个角色中实现后继链。

  2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则它的后继者。
 
    纯的责任链模式,一个具体处理者角色只能对请求作出两种:自己处理;传给下家。不能出现处理了一部分,把剩下的传给了下家的情况。而且请求在责任链中必须被处理,而不能出现无果而终的结局。

  反之,则就是不纯的责任链模式。

  不纯的责任链模式还算是责任链模式吗?比如一个请求被捕获后,每个具体处理者都尝试去处理它,不管结果如何都将请求再次转发。我认为这种方式的实现,算不算是责任链模式的一种倒不重要,重要的是我们也能从中体味到责任链模式的思想:通过将多个处理者之间联系,来达到请求与具体的某个处理者的解耦。

 

//抽象处理者(Handler)角色 Handler.java
public abstract class Handler
{ 
     protected Handler successor; 
     public abstract void handleRequest(); 
     public void setSuccessor(Handler successor) 
     { 
         this.successor = successor;

     } 
     public Handler getSuccessor() 
     { 
         return successor; 
     }
}


// ConcreteHandler1.java
public class ConcreteHandler1 extends Handler
{ 
     public void handleRequest() 
     { 
         boolean someCondition = true; 
         if (someCondition) 
         {

              //如果满足条件,进行处理 

         } 
         else 
         { 
              //否则,传递给下家处理 
              if (successor != null) 
              { 
                   successor.handleRequest(); 
              } 
         } 
     }
}



// ConcreteHandler2.java
public class ConcreteHandler2 extends Handler
{ 
     public void handleRequest() 
     { 
         boolean someCondition = true; 
         if (someCondition) 
         {

              //如果满足条件,进行处理 

         } 
         else 
         {   //否则,传递给下家处理 
              if (successor != null) 
              {

                   successor.handleRequest();

              } 
         } 
     }
}



public class Client
{

     public static int Main(String[] args) 
     {

         // Set up chain (usually one need to be done once) 
         Handler firstHandler = new ConcreteHandler1();

         Handler secondHandler = new ConcreteHandler2();

         //Handler thirdHandler = new ConcreteHandler3();


         firstHandler.setSuccessor(secondHandler);

         //secondHandler.SetSuccessor(thirdHandler); 

         firstHandler.handleRequest(); 

         return 0;

     }

}

阅读(1225) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~