android OkHttp, RecyclerView , Glide, Retrofit 常用的设计模式 详解
2026/8/24 1:53:46 网站建设 项目流程

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.BuilderRequest.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 mObservable

  • RecyclerView通过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)

应用点ItemDecorationItemAnimator

  • 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 保证线程安全

内部管理EngineMemoryCacheBitmapPoolDiskCache等重量级资源,必须单例防止重复初始化导致内存泄漏。

2. 建造者模式 (Builder)

应用点RequestBuilderRequestOptionsGlideBuilder

java

Glide.with(context) .load(url) .apply(RequestOptions.circleCropTransform()) .into(imageView);

链式调用隐藏了RequestTargetEngineJob等复杂对象的组装。

3. 工厂模式 (Factory) — 大量使用

应用点ModelLoaderFactoryResourceDecoderResourceEncoder

  • 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)

应用点BitmapPoolLruResourceCache

  • 解码图片时优先从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.FactoryCallAdapter.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();

五、横向对比总结

表格

设计模式OkHttpRecyclerViewGlideRetrofit核心意义
责任链✅ Interceptor解耦处理步骤,支持运行时插拔
观察者✅ AdapterDataObserver✅ 生命周期监听数据/状态变化自动通知
适配器✅ Adapter(核心)✅ ModelLoader✅ CallAdapter统一接口,连接异构系统
享元✅ ConnectionPool✅ 四级缓存✅ BitmapPool复用昂贵对象,提升性能
策略✅ LayoutManager✅ 缓存/变换策略✅ 转换器策略运行时替换算法/行为
动态代理✅ create()声明式编程,消除样板
建造者✅ Client/Request✅ RequestBuilder✅ Retrofit.Builder管理多参数对象构造
工厂✅ Call✅ Decoder/Loader✅ Converter/Adapter解耦创建与使用
装饰器✅ ItemDecoration无侵入式扩展功能
模板方法✅ LayoutManager算法骨架固定,细节由子类实现
桥接✅ RV + LM抽象与实现独立变化
单例✅ Glide实例全局资源统一管理

六、面试/架构核心要点

  1. RecyclerView 四级缓存:不是简单的"一个池子",而是Scrap → Cache → Pool的分级策略,匹配不同复用场景,这是享元模式在移动端最精妙的实现。

  2. OkHttp 拦截器链:理解chain.proceed()是责任链的推进器。网络拦截器与应用拦截器的本质区别是插入链路的层级不同(Retry之后 vs Bridge之后)。

  3. Retrofit 动态代理:因为接口方法的注解各不相同,无法在编译期生成固定实现类;动态代理在运行期解析注解并生成行为,是接口声明与 HTTP 执行解耦的最优解。

  4. 跨库协作链路:Retrofit(动态代理+适配器)→ OkHttp(责任链+享元连接池)→ 底层网络;Glide(策略+享元+观察者)→ 图片加载与生命周期绑定。四大库通过设计模式组合,构成了 Android 高性能网络与 UI 的完整基础设施。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询