因为Retrofit做到了很强的解耦,因此就一定需要用到很多设计模式。所以,我觉得,通过阅读Retrofit源码来学习设计模式是再好不过的设计模式学习方法了。

大致看了一圈Retrofit源码,受益匪浅。 从网上盗用两张图,如下: Retrofit设计模式源码解析Retrofit设计模式源码解析 对于网络请求库的封装,主要包括3部分:

1、数据的组装

2、发送网络请求

3、处理返回数据,并回调结果

对于步骤一,数据的组装:

Retrofit采用了外观模式(门面模式)、动态代理模式和建造者模式。Retrofit利用了接口的的方式,将请求数据规范成一个接口,然后通过对用户定义的接口进行解析,然后将解析的数据组装成请求的数据。

Retrofit类作为外部使用的唯一入口,这是一种外面模式,也叫门面模式。用户使用时,只需要使用Retrofit的create方法就可以。

那么用户定义的接口是如何转换成请求数据的呢?Retrofit非常精彩地使用了动态代理,去解析用户定义接口方法中的注解和返回值。

Retrofit设计模式源码解析

对解析的数据进行组装使用的是建造者模式。该建造者模式的实现类是ServiceMethod的Builder类。

Retrofit设计模式源码解析

对于步骤二,发送网络请求:

Retrofit使用了适配器模式、工厂方法模式、策略模式。

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

相关文章: