okhttp和责任链模式

2019-10-17  本文已影响0人  勇敢地追

OkHttp—拦截器这篇文章讲了拦截器,今天就谈谈责任链模式
责任链模式,其实就是把request通过一系列Interceptor过滤,然后通过网络请求获取response,然后再通过Interceptor过滤(方向和request相反)获取最终用户所需要的response
我们可以用责任链模式设计一个请假条审批(小于3天的由直接领导处理,大于3天就是大领导处理)
首先,我们需要定义我们的request和response

public class Request {
    int day = 0;//请假天数
}
public class Response {
    boolean isAgreed = false;//领导是否同意
}

接下来就需要定义处理请假请求的人物的接口

public interface Character {
    Response processRequest(Chain chain);
}

暂时先不管具体实现,放到后面讲更好
接下来就是责任链的核心之处
一般的实现方法都是处理的Request和Response,但是责任链模式处理的是链,同时可以让这个链能够关联相应的Request和Response

//责任链模式的核心---为整个链提供接口,链上必须要有Request和Response
public interface Chain {
    Request getRequest();
    Response processChain();//选择用哪个链去解决相关内容
}

接下来就是Chain的具体实现

public class RealChain implements Chain {
    
    private List<Character> list;
    private Request request;
    private int index = 0;
    
    public RealChain(List<Character> list, Request request, int index) {
        this.list = list;
        this.request = request;
        this.index = index;
    }
    
    @Override
    public Request getRequest() {
        return request;
    }

    @Override
    public Response processChain() {
        RealChain next = new RealChain(list, request, index + 1);
        Response response = list.get(index).processRequest(next);
        //这里不能简单的用index++来更新,不然的话当day>3的时候,会在FirstBoss里面无限循环
        return response;
    }

}

记下来就可以展示Character的具体实现了

//直接领导<=3才能通过,>3要给大领导处理
public class FirstBoss implements Character {

    @Override
    public Response processRequest(Chain chain) {
        Request request = chain.getRequest();
        Response response = new Response();
        if(request.day <= 3) {
            response.isAgreed = true;
            System.out.println("FirstBoss Agreed");
        } else {
            //正式请求中,往SecondBoss传之前可以处理Header里面的信息
            response = chain.processChain();
        }
        //可以进一步处理response,正式请求中可以除去部分信息,如Header里面的信息
        return response;
    }
}


//>3要给大领导处理
public class SecondBoss implements Character {
    @Override
    public Response processRequest(Chain chain) {
        //正式请求中可以做其他处理,这里化简直接返回同意
        Response response = new Response();
        response.isAgreed = true;
        System.out.println("SecondBoss Agreed");
        return response;
    }

}

最后来一段测试代码

public class Main {

    public static void main(String[] args) {
        Request request = new Request();
        request.day = 1;
        
        List<Character> characters = new ArrayList<Character>();
        characters.add(new FirstBoss());
        characters.add(new SecondBoss());
        
        Chain chain = new RealChain(characters, request, 0);
        chain.processChain();
    }
}

各位可以自己尝试着写写,体会一下.责任链模式最精妙的地方就在于Chain的设计.《Android设计模式》里面介绍的责任链和这个有区别,书里面的责任链的实现是通过自己设置setNext的方式,这里提到的其实就是okhttp里面的写法,用的是Chain.本质还是相同的,区别就是chain的具体实现有区别

上一篇下一篇

猜你喜欢

热点阅读