android OkHttp, RecyclerView , Glide, Retrofit 常用的设计模式 详解 Android 四大核心库OkHttp、RecyclerView、Glide、Retrofit的设计模式运用非常经典它们不是简单套用而是深度融入源码架构。以下按库分类从源码机制到实际价值逐一详解。一、OkHttp 中的设计模式1. 责任链模式 (Chain of Responsibility) — 架构核心应用点Interceptor拦截器链一次网络请求被拆成独立的拦截器节点按固定顺序执行plainRetryAndFollowUpInterceptor → BridgeInterceptor → CacheInterceptor → ConnectInterceptor → CallServerInterceptor源码机制RealInterceptorChain持有ListInterceptor和当前index每个拦截器通过chain.proceed(request)将请求传递给下一环也可以直接返回Response中断链条用户自定义拦截器通过addInterceptor()应用层或addNetworkInterceptor()网络层插入链路价值彻底解耦重试、补全Header、缓存、连接、发请求等环节支持无侵入式扩展。2. 建造者模式 (Builder)应用点OkHttpClient.Builder、Request.BuilderjavaOkHttpClient 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.AdapterVH将任意数据结构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)应用点LayoutManagerLayoutManager定义布局抽象接口不同子类实现不同策略LinearLayoutManager线性排列策略GridLayoutManager网格排列策略StaggeredGridLayoutManager瀑布流策略运行时可通过setLayoutManager()动态切换布局策略无需修改 Adapter 或数据5. 装饰器模式 (Decorator)应用点ItemDecoration、ItemAnimatorItemDecoration在不修改 Adapter 和 ViewHolder 源码的情况下动态添加分割线DividerItemDecoration、间距、高亮等视觉装饰ItemAnimator动态添加插入/删除/移动动画效果符合对扩展开放对修改关闭原则6. 模板方法模式 (Template Method)应用点LayoutManagerLayoutManager定义算法骨架如onLayoutChildren()、scrollHorizontallyBy()子类必须实现具体的测量和布局逻辑RecyclerView 框架负责调度流程具体策略由子类填充7. 桥接模式 (Bridge)应用点RecyclerView 与 LayoutManager 的分离抽象部分RecyclerView负责滚动、触摸、回收调度实现部分LayoutManager负责具体测量和布局两者独立变化更换 LayoutManager 不需要改动 RecyclerView 核心代码三、Glide 中的设计模式1. 单例模式 (Singleton)应用点Glide全局实例javaGlide.get(context) // 全局唯一Double-Check volatile 保证线程安全内部管理Engine、MemoryCache、BitmapPool、DiskCache等重量级资源必须单例防止重复初始化导致内存泄漏。2. 建造者模式 (Builder)应用点RequestBuilder、RequestOptions、GlideBuilderjavaGlide.with(context) .load(url) .apply(RequestOptions.circleCropTransform()) .into(imageView);链式调用隐藏了Request、Target、EngineJob等复杂对象的组装。3. 工厂模式 (Factory) — 大量使用应用点ModelLoaderFactory、ResourceDecoder、ResourceEncoderGlide 通过Registry维护工厂注册表根据数据类型URL、File、Uri、ResourceId和输出类型Bitmap、Drawable、GifDrawable动态匹配对应的加载器和解码器例如注册HttpUriLoader.Factory负责将 String URL 转为 InputStream价值解耦数据获取→解码→变换→编码全链路支持任意自定义数据源。4. 策略模式 (Strategy)应用点缓存策略、图片变换、磁盘缓存策略DiskCacheStrategy.ALL / DATA / RESOURCE / NONE运行时切换缓存行为BitmapTransformationCenterCrop、FitCenter、CircleCrop同一接口不同算法实现5. 观察者模式 (Observer)应用点生命周期绑定RequestManager通过LifecycleListener监听 Activity/Fragment 的onStart/onStop/onDestroy页面销毁时自动取消请求防止内存泄漏和无效加载6. 享元模式 (Flyweight)应用点BitmapPool和LruResourceCache解码图片时优先从BitmapPool复用旧 Bitmap 的内存块减少 GC 和内存分配开销符合大量细粒度对象共享思想四、Retrofit 中的设计模式1. 动态代理模式 (Dynamic Proxy) — 灵魂设计应用点接口到 HTTP 请求的转换javaGitHubService service retrofit.create(GitHubService.class); service.listRepos(octocat); // 无实现类直接调用源码机制Retrofit.create(ClassT)内部使用Proxy.newProxyInstance()生成动态代理对象调用接口方法时触发InvocationHandler.invoke()运行时解析方法注解GET、Path、Query组装为ServiceMethod最终交给OkHttpCall执行价值零样板代码声明式 API 与底层 HTTP 执行完全解耦。2. 适配器模式 (Adapter)应用点CallAdapter默认返回CallT通过适配器可转换为ObservableTRxJavaDeferredTKotlin CoroutinesLiveDataTjavaRetrofit.Builder() .addCallAdapterFactory(RxJava3CallAdapterFactory.create())将 Retrofit 内部的Call接口包装为用户期望的类型。3. 工厂模式 (Factory)应用点Converter.Factory、CallAdapter.FactoryGsonConverterFactoryResponseBody → Java Bean用户可自定义 ConverterProtobuf、Fastjson、Moshi通过工厂注册扩展4. 建造者模式 (Builder)应用点Retrofit.Builderjavanew 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实例❌全局资源统一管理六、面试/架构核心要点RecyclerView 四级缓存不是简单的一个池子而是Scrap → Cache → Pool的分级策略匹配不同复用场景这是享元模式在移动端最精妙的实现。OkHttp 拦截器链理解chain.proceed()是责任链的推进器。网络拦截器与应用拦截器的本质区别是插入链路的层级不同Retry之后 vs Bridge之后。Retrofit 动态代理因为接口方法的注解各不相同无法在编译期生成固定实现类动态代理在运行期解析注解并生成行为是接口声明与 HTTP 执行解耦的最优解。跨库协作链路Retrofit动态代理适配器→ OkHttp责任链享元连接池→ 底层网络Glide策略享元观察者→ 图片加载与生命周期绑定。四大库通过设计模式组合构成了 Android 高性能网络与 UI 的完整基础设施。