在分析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