引言
关于retrofit源码解析的文章已经有很多了,我在拜读了许多文章之后在此记录一下,算是对retrofit的一个深入理解,以及其中用到的设计模式的学习。
构造者模式
构造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。
构造者模式的优点是:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
public class Student {
private int id;
private String name;
private String passwd;
private String sex;
private String address;
// 构造器尽量缩小范围
private Student() {
}
// 构造器尽量缩小范围
private Student(Student origin) {
// 拷贝一份
this.id = origin.id;
this.name = origin.name;
this.passwd = origin.passwd;
this.sex = origin.sex;
this.address = origin.address;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getPasswd() {
return passwd;
}
public String getSex() {
return sex;
}
public String getAddress() {
return address;
}
/**
* Student的创建完全依靠Student.Builder,使用一种方法链的方式来创建
*
*/
public static class Builder {
private Student target;
public Builder() {
target = new Student();
}
public Builder address(int id) {
target.id = id;
return this;
}
public Builder name(String name) {
target.name = name;
return this;
}
public Builder password(String passwd) {
target.passwd = passwd;
return this;
}
public Builder sex(String sex) {
target.sex = sex;
return this;
}
public Builder address(String address) {
target.address = address;
return this;
}
public Student build() {
return new Student(target);
}
}
}
使用Student s=new Student.Builder().name("CC").password("qwerty").sex("男").address("银河系第二旋臂").build();
Retrofit中的构造者模式
Retrofit retrofit = new Retrofit.Builder()
.client(getOkHttpClient())
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
public Retrofit build() {
// 必须得设置baseUrl,不然就直接抛出异常
if (baseUrl == null) {
throw new IllegalStateException("Base URL required.");
}
// 如果不设置okhttp3.Call.Factory,会默认直接new OkHttpClient();可见如果需要对okhttpclient进行详细的设置,需要构建OkHttpClient对象,然后传入;
okhttp3.Call.Factory callFactory = this.callFactory;
if (callFactory == null) {
callFactory = new OkHttpClient();
}
// 用来将回调传递到UI线程的。 这里有一个platform对象,可以利用该对象进行平台的判断:如果是Android平台,会自定义一个Executor对象,并且利用Looper.getMainLooper()实例化一个handler对象,在Executor内部通过handler.post(runnable)
Executor callbackExecutor = this.callbackExecutor;
if (callbackExecutor == null) {
callbackExecutor = platform.defaultCallbackExecutor();
}
// Make a defensive copy of the adapters and add the default Call adapter.
// adapterFactories,这个对象主要用于对Call进行转化,基本上不需要我们自己去自定义。
List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));
// Make a defensive copy of the converters.
// converterFactories,该对象用于转化数据,例如将返回的responseBody转化为对象等;当然不仅仅是针对返回的数据,还能用于一般备注解的参数的转化例如@Body标识的对象做一些操作
List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);
// 返回retrofit对象
return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
callbackExecutor, validateEagerly);
}
相关参考链接
Retrofit2 完全解析 探索与okhttp之间的关系
别人家SDK中的设计模式--Android Retrofit库源码解读
Retrofit分析-漂亮的解耦套路
独特的架构方式,Retrofit源码简析。