Retrofit里面还充斥着大量的设计模式
建造者模式
首先肯定是建造者模式,这个太普遍了,几乎哪里都使用到了,就不做过多的说明
工厂模式
然后是工厂模式,采用的是抽象工厂模式,在它额Converter抽象类中可以很明显的看到
public interface Converter<F, T> {
@Nullable T convert(F value) throws IOException;
/** Creates {@link Converter} instances based on a type and target usage. */
abstract class Factory {
public @Nullable Converter<ResponseBody, ?> responseBodyConverter(Type type,
Annotation[] annotations, Retrofit retrofit) {
return null;
}
public @Nullable Converter<?, RequestBody> requestBodyConverter(Type type,
Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
return null;
}
public @Nullable Converter<?, String> stringConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
return null;
}
protected static Type getParameterUpperBound(int index, ParameterizedType type) {
return Utils.getParameterUpperBound(index, type);
}
protected static Class<?> getRawType(Type type) {
return Utils.getRawType(type);
}
}
}
其中还有个工厂方法模式,这里要注意一下其中的区别。
抽象工厂是由工厂方法实现的,抽象工厂描述的是一个宏观的概念,工厂方法则是具体到细节上了。
适配器模式
这个则是在CallAdapter中得到了充分的体现。
适配器模式的UML描述如下:个人感觉很容易理解的一种模式
在Retrofit的使用如下:
这里还包括很多自定义的CallAdapter等等,都能够完成相应的适配转换。
代理模式
可能这就是Retrofit的一个突出特点了,但是要注意,Retrofit并没有实现代理模式,只是用到了java的动态代理方法。
这里包括了静态代理和动态代理。代理模式UML图如下
联想到明星和经纪人的关系也就很容易理解了。
这里也要提一下代理模式和装饰模式的区别,从结构和UML图上来看,两者很相似,所有区别我觉得就应该在语义上面,
代理的作用是控制一个对象的访问,即不能直接访问到该对象
装饰的作用则是增强对象,新加某个原对象不具有的功能
设计模式毕竟是要实现某个目标的,所有要从目的上考虑设计模式,而不是根据设计模式的结果反推怎么使用。
下面做个总结吧
Retrofit也就基本了解了,越到后面越是体会到了什么叫做高度的解耦,大神的构思果然令人赞叹,下面引用其他人的完成总体的流程吧Retrofit分析-漂亮的解耦套路