OkHttp源码解析(构建者模式、责任链模式、主线流程)

本文深入解析OkHttp的构建者模式和责任链模式。通过实例解析OkHttpClient与Request如何使用构建者模式创建,以及为何采用此模式。同时探讨OkHttp如何运用责任链模式处理响应,分析其主线流程,包括入队操作、网络访问和线程池设计,以及为何能实现快速访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在分析OkHttp的核心流程已经核心类之前,我们先搞清楚两个概念,一个是OkHttpClient和Request在创建时所使用的构建者模式;另外一个则是负责响应处理的拦截器模式;

OkHttpClient/Request的构建者模式解析

基本概念

构建者(又称建造者)模式允许我们使用多个简单的对象一步一步构建成一个复杂的对象。

概念解释

如果你要装修房子,你就会要考虑这个房子的整体设计怎么做,用地中海风格?欧美风格?纯中式风格?墙面是刷白色的漆?贴瓷砖?还是用其他颜色?水电安装怎么处理?防水怎么处理?主卧怎么设计?阳台怎么设计?当你开始装修的时候,你就发现你要处理的事情实在太多,所以你想了一个办法,找了一家装修公司的人帮你做设计。

他们给你提供了一些默认的参数,比如,就用纯中式的风格,墙面使用硅藻泥,防水使用A方案设计,水电使用B方案设计等等;你觉得他们给你提供的默认风格都挺好的,唯一你觉得不好的就是他们这一整套设计里,阳台用的是“封闭式”设计,而你希望用“开放式”设计,所以你决定其他的都使用默认值,唯独这个阳台使用你提出的“开放式”设计。

  • 优点:我们不需要再关心装修房子时的每个细节;因为它提供了默认值;
  • 缺点:除了装修施工的钱,我们还需要额外付出装修设计的钱;

接下来再将这个例子带入到OkHttp源码中去看待:

为什么OkHttpClient以及Request使用构建者模式来创建?

当一个类的内部数据过于复杂的时候,比如OkHttpClient中包含Dispatcher,Proxy,ProxySelector,CookieJar,Cache,SocketFactory等等对象,Request中也包含了HttpUrl,method,Headers,RequestBody,tag等对象;这些对象说多不多,说少也不少,但它们都有一个共同点:很多参数都是不需要我们传递的,比如这两个对象在具体构建时的代码如下:

OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(url).build();

OkHttpClient和Request中虽然包含了多个参数,但这些参数对于用户来说,是可传可不传的,在上述代码中只有在构建Requset时通过Builder.url(url).build()传入了一个url参数;这就相当于,如果我们不传入参数,构建者模式会帮我们创建默认的参数;如果传入参数,构建者模式则会用我们传入的替换默认的参数;

  • 优点:我们不再关注OkHttpClient/Request的构建细节,不用每次构建时都传入大量参数,只需要传递我们关心的参数,非常易用;

  • 缺点:整个代码看上去会有“代码冗余”的感觉,对于不了解设计模式的人来说会觉得生涩难懂;

构建者模式简易代码实现

public class House3 {
   

    private double height;
    private double width;
    private String color;

    public House3(Builder builder) {
   
        this.height = builder.height;
        this.width = builder.width;
        this.color = builder.color;
    }

    public static final class Builder{
   
        double height;
        double width;
        String color;

        public Builder(){
   
            this.height = 100;
            this.width = 100;
            this.color = "red";
        }

        public Builder addHeight(double height) {
   
            this.height = height;
            return this;
        }

        public Builder addWidth(double width
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值