由于Retrofit作到了很强的解耦,所以就必定须要用到不少设计模式。因此,我以为,经过阅读Retrofit源码来学习设计模式是再好不过的设计模式学习方法了。设计模式
大体看了一圈Retrofit源码,受益不浅。 从网上盗用两张图,以下:
对于网络请求库的封装,主要包括3部分:网络
一、数据的组装框架
二、发送网络请求学习
三、处理返回数据,并回调结果优化
对于步骤一,数据的组装:ui
Retrofit采用了外观模式(门面模式)、动态代理模式和建造者模式。Retrofit利用了接口的的方式,将请求数据规范成一个接口,而后经过对用户定义的接口进行解析,而后将解析的数据组装成请求的数据。设计
Retrofit类做为外部使用的惟一入口,这是一种外面模式,也叫门面模式。用户使用时,只须要使用Retrofit的create方法就能够。3d
那么用户定义的接口是如何转换成请求数据的呢?Retrofit很是精彩地使用了动态代理,去解析用户定义接口方法中的注解和返回值。代理
对解析的数据进行组装使用的是建造者模式。该建造者模式的实现类是ServiceMethod的Builder类。blog
对于步骤二,发送网络请求:
Retrofit使用了适配器模式、工厂方法模式、策略模式。
Retrofit默认使用了OkHttpCall进行网络请求,这块是写死的代码,之后可能会优化,也多是square公司如今在绑定推广retrofit和okhttp吧,可是从Retrofit的设计上看,将网络请求库改为可灵活配置,也是比较容易的。
由于Retrofit在网络库的配置上采用了适配器模式。其中,CallAdapter就是用于调用OkHttpCall进行网络请求的。
Retrofit定义了CallAdapter接口和CallAdapter.Factory接口,这是一种工厂方法模式,只有在框架的灵活配置上才会使用工厂方法模式。
对于Retrofit的策略模式,在Java8CallAdapter中使用了,根据不一样的状况返回BodyCallAdapter和ResponseCallAdapter。
对于步骤三,处理返回数据,并回调结果
是在OkHttpCall中进行的。采用了工厂方法模式。
Retrofit定义了Converter和Converter.Factory接口,进行数据的处理。这是工厂方法模式。
用Converter对返回结果进行处理,是在ServiceMethod类中的方法中进行的,而这个方法是在OkHttpCall中调用的。
综上,经过阅读Retrofit源码,让我对设计模式的理解更加深刻。理解了一些在头脑中以前很模糊的设计模式概念。