Android 四大核心库(OkHttp、RecyclerView、Glide、Retrofit)的设计模式运用非常经典,它们不是简单套用,而是深度融入源码架构。以下按库分类,从源码机制到实际价值逐一详解。
一、OkHttp 中的设计模式
1. 责任链模式 (Chain of Responsibility) — 架构核心
应用点:Interceptor拦截器链
一次网络请求被拆成独立的拦截器节点,按固定顺序执行:
plain
RetryAndFollowUpInterceptor → BridgeInterceptor → CacheInterceptor → ConnectInterceptor → CallServerInterceptor源码机制:
RealInterceptorChain持有List<Interceptor>和当前index每个拦截器通过
chain.proceed(request)将请求传递给下一环,也可以直接返回Response中断链条用户自定义拦截器通过
addInterceptor()(应用层)或addNetworkInterceptor()(网络层)插入链路
价值:彻底解耦"重试、补全Header、缓存、连接、发请求"等环节,支持无侵入式扩展。
2. 建造者模式 (Builder)
应用点:OkHttpClient.Builder、Request.Builder
java
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .addInterceptor(new LoggingInterceptor()) .build();价值:避免构造器参数爆炸(OkHttpClient 有几十个配置项),支持链式可选配置。
3. 享元模式 (Flyweight)
应用点:ConnectionPool连接池
对同一服务器的 TCP/SSL 连接进行复用,通过
RealConnection的引用计数和空闲超时清理实现共享减少频繁创建 Socket 连接的系统开销
4. 工厂模式 (Factory)
应用点:Call的创建
OkHttpClient.newCall(Request)统一返回RealCall实例将对象的创建与使用分离,同步/异步逻辑内部封装
二、RecyclerView 中的设计模式
1. 观察者模式 (Observer) — 数据驱动 UI
应用点:Adapter 数据变化通知机制
源码机制:
RecyclerView.Adapter内部维护AdapterDataObservable mObservableRecyclerView通过setAdapter()注册RecyclerViewDataObserver调用
notifyDataSetChanged()/notifyItemChanged()时,触发 observer 的onChanged()/onItemRangeChanged(),进而请求重绘或局部刷新
价值:实现数据与视图的解耦,数据层变动自动触发 UI 更新。
2. 适配器模式 (Adapter) — 核心桥梁
应用点:RecyclerView.Adapter<VH>
将任意数据结构(List、Cursor、PagedList 等)适配为 RecyclerView 能理解的
ViewHolder集合统一接口:
onCreateViewHolder()、onBindViewHolder()、getItemCount()开发者只需关注数据→视图的映射,无需关心 RecyclerView 内部的测量、布局、回收逻辑
3. 享元模式 (Flyweight) — 四级缓存体系
应用点:RecyclerView.RecycledViewPool等缓存机制
RecyclerView 通过四级缓存复用 ViewHolder,避免频繁 inflate 和 findViewById:
表格
| 缓存级别 | 类/变量 | 容量/特点 | 作用 |
|---|---|---|---|
| 一级 | mChangedScrap | 无固定上限 | 布局动画期间,数据变化但位置未变的 Item |
| 二级 | mAttachedScrap | 无固定上限 | 重新布局时,当前屏幕内 Item 的临时缓存 |
| 三级 | mCachedViews | 默认 2 | 刚滑出屏幕的 Item,可快速回滚复用 |
| 四级 | mRecyclerPool | 每种 viewType 默认 5 | 按 viewType 分组的 ViewHolder 池 |
价值:通过对象复用大幅降低 GC 压力和布局 inflation 开销,实现"无限列表"的流畅滚动。
4. 策略模式 (Strategy)
应用点:LayoutManager
LayoutManager定义布局抽象接口,不同子类实现不同策略:LinearLayoutManager:线性排列策略GridLayoutManager:网格排列策略StaggeredGridLayoutManager:瀑布流策略
运行时可通过
setLayoutManager()动态切换布局策略,无需修改 Adapter 或数据
5. 装饰器模式 (Decorator)
应用点:ItemDecoration、ItemAnimator
ItemDecoration:在不修改 Adapter 和 ViewHolder 源码的情况下,动态添加分割线(DividerItemDecoration)、间距、高亮等视觉装饰ItemAnimator:动态添加插入/删除/移动动画效果符合"对扩展开放,对修改关闭"原则
6. 模板方法模式 (Template Method)
应用点:LayoutManager
LayoutManager定义算法骨架(如onLayoutChildren()、scrollHorizontallyBy()),子类必须实现具体的测量和布局逻辑RecyclerView 框架负责调度流程,具体策略由子类填充
7. 桥接模式 (Bridge)
应用点:RecyclerView 与 LayoutManager 的分离
抽象部分:
RecyclerView(负责滚动、触摸、回收调度)实现部分:
LayoutManager(负责具体测量和布局)两者独立变化:更换 LayoutManager 不需要改动 RecyclerView 核心代码
三、Glide 中的设计模式
1. 单例模式 (Singleton)
应用点:Glide全局实例
java
Glide.get(context) // 全局唯一,Double-Check + volatile 保证线程安全内部管理Engine、MemoryCache、BitmapPool、DiskCache等重量级资源,必须单例防止重复初始化导致内存泄漏。
2. 建造者模式 (Builder)
应用点:RequestBuilder、RequestOptions、GlideBuilder
java
Glide.with(context) .load(url) .apply(RequestOptions.circleCropTransform()) .into(imageView);链式调用隐藏了Request、Target、EngineJob等复杂对象的组装。
3. 工厂模式 (Factory) — 大量使用
应用点:ModelLoaderFactory、ResourceDecoder、ResourceEncoder
Glide 通过
Registry维护工厂注册表,根据数据类型(URL、File、Uri、ResourceId)和输出类型(Bitmap、Drawable、GifDrawable)动态匹配对应的加载器和解码器例如:注册
HttpUriLoader.Factory负责将 String URL 转为 InputStream
价值:解耦"数据获取→解码→变换→编码"全链路,支持任意自定义数据源。
4. 策略模式 (Strategy)
应用点:缓存策略、图片变换、磁盘缓存策略
DiskCacheStrategy.ALL / DATA / RESOURCE / NONE:运行时切换缓存行为BitmapTransformation(CenterCrop、FitCenter、CircleCrop):同一接口不同算法实现
5. 观察者模式 (Observer)
应用点:生命周期绑定
RequestManager通过LifecycleListener监听 Activity/Fragment 的onStart/onStop/onDestroy页面销毁时自动取消请求,防止内存泄漏和无效加载
6. 享元模式 (Flyweight)
应用点:BitmapPool和LruResourceCache
解码图片时优先从
BitmapPool复用旧 Bitmap 的内存块,减少 GC 和内存分配开销符合"大量细粒度对象共享"思想
四、Retrofit 中的设计模式
1. 动态代理模式 (Dynamic Proxy) — 灵魂设计
应用点:接口到 HTTP 请求的转换
java
GitHubService service = retrofit.create(GitHubService.class); service.listRepos("octocat"); // 无实现类,直接调用源码机制:
Retrofit.create(Class<T>)内部使用Proxy.newProxyInstance()生成动态代理对象调用接口方法时,触发
InvocationHandler.invoke()运行时解析方法注解(
@GET、@Path、@Query),组装为ServiceMethod,最终交给OkHttpCall执行
价值:零样板代码,声明式 API 与底层 HTTP 执行完全解耦。
2. 适配器模式 (Adapter)
应用点:CallAdapter
默认返回
Call<T>,通过适配器可转换为:Observable<T>(RxJava)Deferred<T>(Kotlin Coroutines)LiveData<T>
java
Retrofit.Builder() .addCallAdapterFactory(RxJava3CallAdapterFactory.create())将 Retrofit 内部的Call接口包装为用户期望的类型。
3. 工厂模式 (Factory)
应用点:Converter.Factory、CallAdapter.Factory
GsonConverterFactory:ResponseBody → Java Bean用户可自定义 Converter(Protobuf、Fastjson、Moshi),通过工厂注册扩展
4. 建造者模式 (Builder)
应用点:Retrofit.Builder
java
new Retrofit.Builder() .baseUrl("https://api.github.com/") .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build();五、横向对比总结
表格
| 设计模式 | OkHttp | RecyclerView | Glide | Retrofit | 核心意义 |
|---|---|---|---|---|---|
| 责任链 | ✅ Interceptor | ❌ | ❌ | ❌ | 解耦处理步骤,支持运行时插拔 |
| 观察者 | ❌ | ✅ AdapterDataObserver | ✅ 生命周期监听 | ❌ | 数据/状态变化自动通知 |
| 适配器 | ❌ | ✅ Adapter(核心) | ✅ ModelLoader | ✅ CallAdapter | 统一接口,连接异构系统 |
| 享元 | ✅ ConnectionPool | ✅ 四级缓存 | ✅ BitmapPool | ❌ | 复用昂贵对象,提升性能 |
| 策略 | ❌ | ✅ LayoutManager | ✅ 缓存/变换策略 | ✅ 转换器策略 | 运行时替换算法/行为 |
| 动态代理 | ❌ | ❌ | ❌ | ✅ create() | 声明式编程,消除样板 |
| 建造者 | ✅ Client/Request | ❌ | ✅ RequestBuilder | ✅ Retrofit.Builder | 管理多参数对象构造 |
| 工厂 | ✅ Call | ❌ | ✅ Decoder/Loader | ✅ Converter/Adapter | 解耦创建与使用 |
| 装饰器 | ❌ | ✅ ItemDecoration | ❌ | ❌ | 无侵入式扩展功能 |
| 模板方法 | ❌ | ✅ LayoutManager | ❌ | ❌ | 算法骨架固定,细节由子类实现 |
| 桥接 | ❌ | ✅ RV + LM | ❌ | ❌ | 抽象与实现独立变化 |
| 单例 | ❌ | ❌ | ✅ Glide实例 | ❌ | 全局资源统一管理 |
六、面试/架构核心要点
RecyclerView 四级缓存:不是简单的"一个池子",而是
Scrap → Cache → Pool的分级策略,匹配不同复用场景,这是享元模式在移动端最精妙的实现。OkHttp 拦截器链:理解
chain.proceed()是责任链的推进器。网络拦截器与应用拦截器的本质区别是插入链路的层级不同(Retry之后 vs Bridge之后)。Retrofit 动态代理:因为接口方法的注解各不相同,无法在编译期生成固定实现类;动态代理在运行期解析注解并生成行为,是接口声明与 HTTP 执行解耦的最优解。
跨库协作链路:Retrofit(动态代理+适配器)→ OkHttp(责任链+享元连接池)→ 底层网络;Glide(策略+享元+观察者)→ 图片加载与生命周期绑定。四大库通过设计模式组合,构成了 Android 高性能网络与 UI 的完整基础设施。