Android中OkHttp源码阅读二(责任链模式)

news/2024/5/19 16:03:19 标签: android, okhttp, 责任链模式, 设计模式, 源码

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家
👉点击跳转到教程

Android OkHttp源码阅读详解一

看OkHttp源码,发现OkHttp里面使用了责任链设计模式,所以才要学习责任链设计模式  小节2
最终会返回Response
Response getResponseWithInterceptorChain() throws IOException {
    // Build a full stack of interceptors.
    List<Interceptor> interceptors = new ArrayList<>();
    interceptors.addAll(client.interceptors());
    interceptors.add(retryAndFollowUpInterceptor);
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    interceptors.add(new CacheInterceptor(client.internalCache()));
    interceptors.add(new ConnectInterceptor(client));
    if (!forWebSocket) {
      interceptors.addAll(client.networkInterceptors());
    }
    interceptors.add(new CallServerInterceptor(forWebSocket));

    Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
        originalRequest, this, eventListener, client.connectTimeoutMillis(),
        client.readTimeoutMillis(), client.writeTimeoutMillis());

    return chain.proceed(originalRequest);
  }

chain包下的案例 熟悉责任链模式
chain2包下的案例 对应OkHttp源码中的责任链模式getResponseWithInterceptorChain()

阅读OkHttp源码的总结
1.OSI七层模型,TCP/IP参考模型,HTTP格式
2.我们阅读了OkHttp源码的主线流程
3.我们阅读了OkHttp源码缓存方案的线程池
4.我们阅读了OkHttp源码,发现了构建者设计模式责任链模式

一、首先写一个案例熟悉责任链模式

1、定义一个抽象类BaseTask

public abstract class BaseTask {
    //判断当前任务节点,有没有能力执行
    private boolean isTask;


    public BaseTask(boolean isTask) {
        this.isTask = isTask;
    }

    //执行下一个节点
    private BaseTask nextTask; //t2,t3

    //添加下一个节点任务
    public void addNextTask(BaseTask nextTask) {
        this.nextTask = nextTask;
    }

    //让子节点任务去完成的
    public abstract void doActon();

    //动作
    public void action() { //t1=false  t2=false,t3=true
        if (isTask) {
            doActon(); //执行子节点 链条就断了
        } else {
            //继续执行下一个任务节点
            if (nextTask != null) {
                nextTask.action();
            }
        }
    }
}

2、定义四个Task类,都继承自BaseTask,这里只写一个其它三个同理

public class Task1 extends BaseTask {
    public Task1(boolean isTask) {
        super(isTask);
    }

    @Override
    public void doActon() {
        //执行子节点
        System.out.println("Task1 任务节点一 执行了");
    }
}

3、定一个Test类进行测试

public class Test {
    public static void main(String[] args) {
        Task1 task1 = new Task1(false);
        Task2 task2 = new Task2(false);
        Task3 task3 = new Task3(true);
        Task4 task4 = new Task4(false);

        task1.addNextTask(task2);
        task2.addNextTask(task3);
        task3.addNextTask(task4);

        //执行第一个任务节点
        task1.action();
    }
}

输出结果:

Task3  任务节点三 执行了

二、写一个案例熟悉责任链模式,对应OkHttp源码中的责任链模式getResponseWithInterceptorChain()

1.首先定义一个接口

public interface IBaseTask {
    /**
     * @param isTask    任务节点是否有人执行
     * @param iBaseTask 下一个任务节点
     */
    void doRunAction(String isTask, IBaseTask iBaseTask);
}

2.定义一个链条管理类ChainManager

public class ChainManager implements IBaseTask {
    private List<IBaseTask> mIBaseTaskList = new ArrayList<>();
    private int index = 0;

    public void addTask(IBaseTask iBaseTask) {
        mIBaseTaskList.add(iBaseTask);
    }

    @Override
    public void doRunAction(String isTask, IBaseTask iBaseTask) {
        if (mIBaseTaskList.isEmpty()) {
            //抛出异常
            return;
        }
        if (index >= mIBaseTaskList.size()) {
            return;
        }
        IBaseTask iBaseTaskResult = mIBaseTaskList.get(index);//t1
        index++;
        iBaseTaskResult.doRunAction(isTask, iBaseTask);
    }
}

3.定义三个Task1,Task2,Task3

public class Task1 implements IBaseTask {
    @Override
    public void doRunAction(String isTask, IBaseTask iBaseTask) {
        if ("no".equals(isTask)) {
            System.out.println("拦截器任务节点1 处理了...");
            return;
        } else {
            iBaseTask.doRunAction(isTask, iBaseTask);
        }
    }
}

public class Task2 implements IBaseTask {
    @Override
    public void doRunAction(String isTask, IBaseTask iBaseTask) {
        if ("ok".equals(isTask)) {
            System.out.println("拦截器任务节点2 处理了...");
            return;
        } else {
            iBaseTask.doRunAction(isTask, iBaseTask);
        }
    }
}
public class Task3 implements IBaseTask {
    @Override
    public void doRunAction(String isTask, IBaseTask iBaseTask) {
        if ("no".equals(isTask)) {
            System.out.println("拦截器任务节点3 处理了...");
            return;
        } else {
            iBaseTask.doRunAction(isTask, iBaseTask);
        }
    }
}

4、定义一个Test类进行测试

public class Test {
    public static void main(String[] args) {
        ChainManager chainManager = new ChainManager();
        chainManager.addTask(new Task1());
        chainManager.addTask(new Task2());
        chainManager.addTask(new Task3());
        chainManager.doRunAction("ok", chainManager);
    }
}

输出结果如下:

拦截器任务节点2 处理了...

http://www.niftyadmin.cn/n/4998490.html

相关文章

3D封装技术发展

长期以来&#xff0c;芯片制程微缩技术一直驱动着摩尔定律的延续。从1987年的1um制程到2015年的14nm制程&#xff0c;芯片制程迭代速度一直遵循摩尔定律的规律&#xff0c;即芯片上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍。但2015年以后&#xff0c;芯片制…

边缘路由器是什么意思?全方位了解它

边缘路由器是什么意思&#xff1f;边缘路由器是连接网络的边界点和其他网络的路由器&#xff0c;边缘路由器主要位于网络的外围&#xff0c;而处在网络中心的路由器则是核心路由器&#xff0c;核心路由器和边缘路由器是两个相对的概念&#xff0c;边缘路由器与普通的路由器大小…

elasticsearch的DSL查询文档

DSL查询分类 查询所有&#xff1a;查询出所有数据&#xff0c;一般测试用。例如&#xff1a;match_all 全文检索&#xff08;full text&#xff09;查询&#xff1a;利用分词器对用户输入内容分词&#xff0c;然后去倒排索引库中匹配。例如&#xff1a; match_query multi_ma…

Linux--进程--创建子进程一般目的

父进程创建子进程的目的&#xff1a;简单来说&#xff1a;给特定的输入&#xff0c;给出特定的输出 父进程希望复制自己&#xff0c;使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服务请求。当请求到达&#xff0c;父进程调用fork&…

前端小案例2:js实现请求资源过程中进行加载中的样式

前端小案例&#xff1a; 案例&#xff1a;项目中遇到这样一个场景&#xff0c;在前端请求服务器获取部分资源&#xff0c;在等待请求回复之前&#xff0c;需要在前端展示一个loading&#xff0c;在接收到请求的回复后&#xff0c;就取消loading&#xff0c;展示资源。 当使用…

【vue】vue前端实现随机验证码(数字、字母混合)功能

效果图&#xff1a;使用canvas组件对随机的数字字母添加插画背景、干扰线、干扰点 1、在components文件夹下新建securityCode.vue文件&#xff0c;代码&#xff1a; <template><canvas id"s-canvas" :width"contentWidth" :height"contentH…

数学建模:回归分析

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;回归分析 文章目录 数学建模&#xff1a;回归分析回归分析多元线性回归案例 多项式回归一元多项式回归多元二项式回归 非线性回归逐步回归 回归分析 多元线性回归 案例 首先进行回归分…