因为Retrofit做到了很强的解耦,因此就一定需要用到很多设计模式。所以,我觉得,通过阅读Retrofit源码来学习设计模式是再好不过的设计模式学习方法了。
大致看了一圈Retrofit源码,受益匪浅。 从网上盗用两张图,如下: 对于网络请求库的封装,主要包括3部分:
1、数据的组装
2、发送网络请求
3、处理返回数据,并回调结果
对于步骤一,数据的组装:
Retrofit采用了外观模式(门面模式)、动态代理模式和建造者模式。Retrofit利用了接口的的方式,将请求数据规范成一个接口,然后通过对用户定义的接口进行解析,然后将解析的数据组装成请求的数据。
Retrofit类作为外部使用的唯一入口,这是一种外面模式,也叫门面模式。用户使用时,只需要使用Retrofit的create方法就可以。
那么用户定义的接口是如何转换成请求数据的呢?Retrofit非常精彩地使用了动态代理,去解析用户定义接口方法中的注解和返回值。
对解析的数据进行组装使用的是建造者模式。该建造者模式的实现类是ServiceMethod的Builder类。
对于步骤二,发送网络请求:
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源码,让我对设计模式的理解更加深入。理解了一些在头脑中之前很模糊的设计模式概念。
转载于:https://my.oschina.net/tingzi/blog/3002269