责任链模式


责任链模式

责任链模式:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式的重点在“链”,由抽象类中的方法决定由那个实现类处理该请求,并返回结果,其通用类图如下:

抽象的处理者Handler实现三个职责:一个是定义一个请求的处理方法handleRequest(),唯一对外开放的方法;一个是定义一个链的编排方法setLevel(),即处理请求的先后顺序,还有设置和获取当前类的处理等级;第三个是定义了具体的请求者必须实现的具体处理任务response()。通用类图的源码如下:

public class Request {

//定义当前请求的处理等级
private int level;
public Request(){
    this.level = 1; //默认处理等级为1
}
public void setLevel(int level){
    this.level = level;
}
public int getLevel(){
    return this.level;
}

}

public abstract class Handler {

private Handler nextHandler;
private int level;
protected void setNextHanlder(Handler handler){
    this.nextHandler = handler;
}
//模板方法,判断请求级别和当前处理的级别
public final String handlerRequest(Request request){
    if(request.getLevel() == this.level)
        return response(request);
    else{
        if(this.nextHandler != null)
            return this.nextHandler.handlerRequest(request);
        else
            return "请求处理失败";
    }
}
protected int getLevel(){
    return this.level;
}
protected void setLevel(int level){
    this.level = level;
}
 //抽象处理方法,具体在子类中实现
protected abstract String response(Request request);

}

public class ConcreteHandler1 extends Handler{

@Override
protected String response(Request request) {
    // TODO Auto-generated method stub
    return "第一个处理者处理请求";
}

}

public class ConcreteHandler2 extends Handler{

@Override
protected String response(Request request) {
    // TODO Auto-generated method stub
    return "第二个处理者处理请求";
}

}

public class Client {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Request request = new Request();
    //request.setLevel(3);
    Handler handler1 = new ConcreteHandler1();
    Handler handler2 = new ConcreteHandler2();
    handler1.setLevel(1);
    handler2.setLevel(2);
    handler1.setNextHanlder(handler2);
    System.out.println(handler1.handlerRequest(request));
}

}

责任链模式的优缺点

优点:责任链模式的优点是将请求和处理分开,请求者可以不用知道谁去处理,处理者不用知道请求的全貌,两者解耦,提高系统灵活性。
缺点:性能问题,每个请求都是从链头遍历到链尾,当链较长时,性能会下降;调试不方便,当链较长时,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。

最佳实践

    在类图中Handler是抽象类,融合了模板方法模式,每个实现类只要实现response请求处理方法。通过融合模板方法模式,各个实现类只需要关注自己的业务逻辑,父类决定请求的具体处理类,即父类实现了请求的传递功能,子类实现请求的处理,符合单一职责原则,各个实现类只完成一个动作或逻辑,也就是只有一个原因引起类的变化。
    责任链屏蔽了请求的处理过程,只需把请求抛给责任链的第一个处理者,不需要知道具体谁来处理请求,这是责任链模式的核心,同时责任链也可以作为一种补救措施。当随着请求的增加,可以添加对新增请求的处理类,上层的调用保持不变。如银行开始只提供人民币的服务,当业务增加需要同时支持对欧元和美元请求的处理。其可以采取责任链模式,其通用类图如下:

声明:DungCry.|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 责任链模式


以此热爱,以此谋生。
Le vent se lève, il faut tenter de vivre