OkHttp源码责任链解析

责任链模式的运用

public interface Interceptor {

  Response intercept(Chain chain) throws IOException;

  interface Chain {
    Request request();
    Response proceed(Request request) throws IOException;
  }
}
  • 1.实例化一个Chain对象,构造器里传入拦截器的一个数组,调用proceed方法
    Interceptor.Chain chain = new RealInterceptorChain(interceptors);
    chain.proceed(....,index = 0)
  • 2.在chain的proceed()的方法中,构造一个新的Chain对象,并且获取拦截器数组的拦截器,将新构造的Chain对象传入拦截器的intercept()方法
 public Response proceed(Request request, StreamAllocation streamAllocation, HttpCodec httpCodec,int index) {
      
    // 这里传入的拦截器,角标加1 
    RealInterceptorChain next = new RealInterceptorChain(interceptors[index + 1], request);
    Interceptor interceptor = interceptors.get(index);
    Response response = interceptor.intercept(next);

    return response;
  }
  • 3.在拦截器的intercept方法中,调用chain.proceed()方法,将再次回到第二步中,再次实例化一个Chain对象,传入构造器数组里的index+1的拦截器,继续执行,依次类推,直到intercept数组中的拦截器执行完。最后一个Chain对象将不再执行proceed()方法。
@Override 
public Response intercept(Chain chain) {

    Reponse networkResponse = chain.proceed(networkRequest);

    return networkResponse;

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容