美文网首页
okhttp和责任链模式

okhttp和责任链模式

作者: 勇敢地追 | 来源:发表于2019-10-17 13:48 被阅读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的具体实现有区别

    相关文章

      网友评论

          本文标题:okhttp和责任链模式

          本文链接:https://www.haomeiwen.com/subject/ybhsmctx.html