一句话总结:
Retrofit 的优雅,在于它通过一套组合拳式的设计模式,构建了一个精密的“声明式翻译引擎”。它以动态代理为核心,将你的 Java/Kotlin 接口“翻译”成一个具体的 OkHttp 请求,并用工厂模式和适配器模式处理“方言”(数据格式)和“口音”(异步方式)。
第一幕:魔法的起点——接口如何“开口说话”?(动态代理模式)
这是 Retrofit 最核心的魔法。当我们调用 retrofit.create(ApiService.class) 时,Retrofit 并没有为我们写一个实现类,而是利用 java.lang.reflect.Proxy 在运行时凭空创造了一个 ApiService 接口的代理对象。
- 角色: 智能翻译官。
- 工作流程: 当你调用
service.getUser(1)时,这个代理对象会立刻“拦截”你的调用,并忠实地记录下所有关键信息:你调用的方法 (getUser)、方法的注解 (@GET,@Path),以及你传入的参数 (1)。 - 架构意义: 这是整个故事的开端。 动态代理模式让 Retrofit 可以将一个静态的、纯粹的接口定义,转化为一个动态的、可处理的运行时事件。
第二幕:蓝图的构建——如何配置这位“翻译官”?(建造者模式 & 工厂模式)
这位“翻译官”虽然聪明,但它需要一套工具(如何解析数据)和工作方式(如何返回结果)。这通过 Retrofit.Builder 来配置。
-
建造者模式 (
Retrofit.Builder): 提供了链式的、清晰的 API 来组装一个复杂的Retrofit实例,避免了繁杂的构造函数。 -
工厂模式 (
Converter.Factory,CallAdapter.Factory):addConverterFactory(...)添加的是“数据加工厂”。例如,GsonConverterFactory这个工厂,能生产出将 JSON 字节流加工成 Java/Kotlin 对象的“流水线工人”(Converter)。addCallAdapterFactory(...)添加的是“交付方式改造厂”。例如,RxJava2CallAdapterFactory能将 OkHttp 默认的Call对象,改造成RxJava用户习惯的Observable对象。协程的suspend函数支持,也是通过一个内置的默认工厂实现的。
协同关系: 我们通过建造者模式,为即将工作的动态代理,装备了由工厂模式提供的、可插拔的“数据处理工具”和“交付工具”。
第三幕:任务的执行——“翻译”与“运输”的完美交接
当代理对象捕获到你的接口调用后,一场从“高级语言”到“机器语言”的翻译开始了:
-
翻译与组装 (Retrofit 的职责):
- 代理对象内部,会根据捕获到的方法注解和参数,构建出一个标准的
okhttp3.Request对象。这是从你的“菜单”到“标准快递单”的翻译过程。 - 然后,Retrofit 会调用
OkHttpClient的newCall(request)方法。
- 代理对象内部,会根据捕获到的方法注解和参数,构建出一个标准的
-
运输与执行 (OkHttp 的职责):
- 责任链模式: 在这里,请求正式进入了 OkHttp 的世界。
OkHttpClient内部的拦截器责任链开始工作,对请求进行缓存检查、添加公共头、重试等一系列“安检”和“加工”。 - 适配器模式 (在
CallAdapter中体现): 在 OkHttp 完成运输,返回Response后,之前由工厂创建的CallAdapter会登场,将 OkHttp 的Call对象及其结果,适配成你接口中定义的最终返回类型(如Observable或协程的suspend结果)。
- 责任链模式: 在这里,请求正式进入了 OkHttp 的世界。
第四章:优雅的终点——隐藏复杂的外观
- 外观模式 (
Retrofit类): 整个Retrofit实例,对于我们开发者来说,就是一个经典的外观。它将动态代理的创建、注解的解析、与 OkHttp 的交互、调用各种工厂等一系列极其复杂的内部流程,全部隐藏在一个简洁的create()方法背后。我们无需关心后厨的繁忙,只需点餐即可。
五、总结:一幅流动的架构画卷
| 设计模式 | 在 Retrofit 架构中的层级与角色 | 带来的架构优势 |
|---|---|---|
| 动态代理 | 核心引擎:将静态接口“动态化”,是所有功能得以实现的基础 | 彻底解耦接口定义与实现,提供极致的 API 简洁性 |
| 工厂模式 | 扩展支柱:生产可插拔的 Converter 和 CallAdapter | 极高的可扩展性,可与任何数据格式和异步框架集成 |
| 建造者模式 | 配置层:用于组装 Retrofit 实例,注入各种工厂和策略 | 安全、灵活地构建复杂实例,提升了 API 的易用性 |
| 外观模式 | API 门面:Retrofit 类本身,隐藏了所有内部复杂性 | 降低了使用门槛,让开发者可以聚焦于业务本身 |
| (委托给 OkHttp的) 责任链模式 | 执行层:在底层实际处理网络请求的每一个步骤 | 功能解耦,提供了强大的请求/响应处理能力 |
| 适配器模式 | 交付层:CallAdapter 将 OkHttp 的 Call 适配为用户期望的类型 | 兼容多种异步编程范式,提升了框架的普适性 |
通过理解这套从“接口定义”到“底层执行”的、由多种设计模式协同构成的“翻译”与“执行”流水线,我们才能真正领会到 Retrofit 设计的精妙与优雅。