责任链模式

应用情景


  责任链模式主要应用在对请求的处理上。当一个请求来临的时候,A、B、C都有可能去处理,由于A、B、C三者的能力不同,他们会更根据请求中携带的数据进行条件判断,如果满足自己的条件,才可以被自己处理,否则  需要由其他人处理。在这种情况下,我们可以使用if...else来处理请求,先进行条件判断,然后交给某人去处理。当然,更好的实现方式是使用责任链模式。将请求直接交给A,A自己进行条件判断,A如果发现自己处理不了,则将请求交给B,B再进行判断,以此类推。

类图关系


 

Handler:抽象类,定义处理方法handleMessage;定义编排方法setNext来设置下一个处理者;定义每个具体的处理者处理级别以及具体处理任务

concreteHandler:继承抽象类,实现自己的处理任务

示例代码


在责任链中前一个对象可以消费(增删改)一部分请求信息后交给下一个对象也是可以的。

public abstract class Handler{
    private Handler nextHandler;
    
    public final Response handleMessage(Request request){
        Response response = null;
        //判断是否是自己的处理级别
        if(this.getHandleLevel().equals(request.getRequestLevel())){
            response = this.echo(request);
        }else{
            if(this.nextHandler != null)
                response = nextHandler.handleMessage(request);
            else{
                //没有适当的处理者,业务自行处理
            }
        }
        return response;
    }
    
    protected void setNext(Handler _handler){
        this.nextHandler = _handler;
    }
    
    protected abstractLevell getHandleLevel();
    
    protected abstract Response echo(Request request);
}

 具体处理者

class ConcreteHandler extends Handler{

    protected Response echo(Request request){
        //完成处理逻辑
        return null;
    }
    
    //设置自己的处理级别
    protected Level getHandlerLevel(){
        return null;
    }
}

模式有关框架的代码

class Level{
    //定义一个请求处理等级
}

class Request{
    //请求处理等级
    public Level getRequestLevel(){
        return null;
    }
}

class Response{
    //处理者返回的数据
}

场景类

class Client{
    public static void main(String[] args) {
        //声明所有的处理节点
    }
    Handler handler1 = new ConcreteHandler();
    Handler handler2 = new ConcreteHandler();
    Handler handler3 = new ConcreteHandler();
    
    //设置链中的阶段程序1->2->3
    handler1.setNext(handler2);
    handler2.setNext(handler3);
    
    //提交请求
    Response response = handler1.handlerMessage(new Request());
}

总结


优点:将请求和处理分开,两者解耦,提高系统的灵活性

缺点:当链比较长,处理请求时性能就是一个问题,二是调试不是方便

原文地址:https://www.cnblogs.com/xidongyu/p/5812075.html