责任链——Chain of Responsibility

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

责任链模式涉及到的角色如下所示:

Ø  抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。下图中的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

Ø  具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。


 

代码如下:

Handler抽象类:

public abstract class Handler {
    protected Handler sucessor;

    public abstract void handleRequest(Request req);
    getter...setter
}

 Handler具体实现子类: 

public class ConcreteHandler1 extends Handler {
    @Override  
    public void handleRequest(Request  condition) {
        // 如果是自己的责任,就自己处理,负责传给下家处理  
        if(condition.getReqStr().equals("ConcreteHandler1")){
            System.out.println( "ConcreteHandler1 handled ");  
            return ;  
        }else{  
            System.out.println( "ConcreteHandler1 passed ");  
            this.getSucessor().handleRequest(condition);
        }  
    }  
}

 另一个实现类:

public class ConcreteHandler2 extends Handler {   
    @Override  
    public void handleRequest(Request condition) {
        // 如果是自己的责任,就自己处理,负责传给下家处理  
        if(condition.getReqStr().equals("ConcreteHandler2")){
            System.out.println( "ConcreteHandler2 handled ");  
            return ;  
        }else{  
            System.out.println( "ConcreteHandler2 passed ");  
            getSucessor().handleRequest(condition);
        }  
    }  
} 

 客户端调用:

Handler handler1 = new ConcreteHandler1();  
Handler handler2 = new ConcreteHandler2();    
  
//链起来  
handler1.setSucessor(handler2);
  
//假设这个请求是ConcreteHandler2的责任
Request request = new Request();
request.setReqStr("ConcreteHandler2");
handler1.handleRequest(request);

 运行结果如下:

ConcreteHandler1 passed 

ConcreteHandler2 handled 

上面简单的例子是根据请求信息来进行过滤,当是自己需要处理的请求时过滤器处理并返回。另外一种是过滤器先处理,再判断是否还有下一个过滤器,有则再交给下一个过滤器。

public void handleRequest(Request  condition) {
    System.out.println("过滤器先处理");
    if (this.getSucessor() != null) {
        this.getSucessor().handleRequest(condition);
    }
  System.out.println("过滤器处理完毕");
}

 纯的与不纯的责任链模式

一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,二是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。

在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。

纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大的意义了。

猜你喜欢

转载自liuluo129.iteye.com/blog/1965425