OKHTTP解析之责任链模式

如题所述

第1个回答  2022-07-18
熟悉或者使用过OKHTTP框架的都了解过,OKHTTP允许我们自定义拦截器做自定义业务,同时内部也存在RetryAndFollowUpInterceptor、
BridgeInterceptor、 CacheInterceptor、ConnectInterceptor、 CallServerInterceptor以及NetworkInterceptors 等各种拦截器,也是OKHTTP进行网络请求的主要实现,对应OKHTTP内部重试,桥接,缓存,链接,请求以及网络等功能。
而这么多拦截器是如何管理和实现的,我们来分析下OKHTTP内部的拦截器机制。
首先我们先来了解一下责任链模式,这是我们理解拦截器实现原理的前提。

责任链定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
UML如下图所示:

下面我们来实现一下责任链机制:
举一个实际的场景:员工申请部门经费,需要经过直接上级、部门领导、老板进行审批,直接上级的权限是审批5W元以下的经费,部门领导有审批10W以下的权限,超过10W都必须要老板直接审批。

首先看下我们平时如何添加拦截器

下图为内部自定义实现的拦截器和框架内部拦截器

我们会经过Dispatcher.enqueue(),然后执行promoteAndExecute()方法进入RealCall$AsyncCall.execute()方法,最终执行getResponseWithInterceptorChain()方法。

首先,会将自定义的interceptor以及内部的拦截器按照顺序添加到list里面;
然后,构建RealInterceptorChain对象,并传入拦截器列表等参数;
最后,调用RealInterceptorChain.proceed方法开始执行责任链机制。

这里首先去获取传入的interceptors(拦截器列表)取出下一个拦截器,并调用拦截器的intercept方法,并传入下一个RealInterceptorChain对象供当前拦截器调用。
相似回答