前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >okhttp和责任链模式

okhttp和责任链模式

作者头像
提莫队长
发布2020-06-02 15:30:25
7720
发布2020-06-02 15:30:25
举报
文章被收录于专栏:刘晓杰刘晓杰刘晓杰

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的具体实现有区别

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档