在 Android 开发中,架构模式的选择直接决定了代码的可维护性、可测试性和解耦程度。本文将带你从底层原理出发,深度剖析四大主流架构模式。
一、 架构演进速览
1. MVC (Model-View-Controller)
结构:Model(数据)、View(UI)、Controller(Activity/Fragment 处理业务逻辑)。
核心:View 直接操控 Model,Controller 负责逻辑分发。
缺点:View 和 Model 耦合严重,代码逻辑混乱,Activity 极易膨胀。
2. MVP (Model-View-Presenter)
结构:接口驱动,View 和 Model 完全隔离,通过 Presenter 进行通信。
P 指什么:Presenter(逻辑层)。它持有 View 和 Model 的接口,作为中间枢纽。
优点:实现彻底解耦,便于单元测试。
缺点:接口数量翻倍,代码量庞大,且 Presenter 若处理不当易导致内存泄露。
3. MVVM (Model-View-ViewModel) —— 目前主流
核心:数据驱动。利用观察者模式实现 UI 自动更新。
通信:View 观察 ViewModel 暴露的 LiveData/StateFlow,不直接持有 View 引用。
优点:生命周期安全,彻底解耦,可应对屏幕旋转等配置变更。
4. MVI (Model-View-Intent) —— 进阶趋势
核心:单向数据流 (UDF)+ 响应式编程。
Model 的新定义:不再是数据源,而是包含界面所有信息的单一不可变 State(状态)。
通信:View 发出 Intent(意图)→ Store 处理 → 生成新 State → View 渲染。
优点:状态强一致性(单一可信源),极其容易调试和状态回溯。
二、 深度解析:MVVM 架构实战
1. 三层职责划分
Model (数据层):网络请求(Retrofit)、数据库(Room)、本地缓存。只提供数据,不关心 UI。
View (视图层):Activity/Fragment/Compose。只负责展示数据和接收用户点击。
ViewModel (逻辑层):连接两者的桥梁,持有业务状态,不持有 View 引用。
2. MVVM 的核心精髓
数据驱动 UI。View 不再主动“拿”数据,而是“订阅”数据变化。ViewModel 数据一变,View 自动刷新。
3. 常见问题与优化方案
痛点:ViewModel 过于臃肿,StateFlow 数量爆炸。
优化策略:
状态聚合:将分散的状态收拢为单一的
UiState类。职责拆分:逻辑下沉至 Repository 层,通用能力(如解析工具)封装为 Manager。
抽象封装:实现 BaseViewModel 处理通用逻辑(如播放控制)。
三、 Google 为什么推崇 MVVM 模式?
Google 推出 Jetpack 工具包(ViewModel, LiveData 等)本质是为了解决 Android 开发的顽疾:
生命周期安全:让数据存活比 View 久,优雅处理配置变更。
防止内存泄露:观察者模式支持自动解绑。
关注点分离:UI 只管展示,逻辑只管数据,极大提升可维护性。
降低空指针风险:数据驱动减少了繁琐的
findViewById操作。
四、 MVVM vs MVI:如何选择?
| 特性 | MVVM | MVI |
| 数据流 | 双向/多向数据源驱动 | 单向数据流 (UDF) |
| 数据源 | View 订阅多个观测对象 | 单一可信源(单一 State 对象) |
| 状态变更 | ViewModel 可直接修改状态 | 强制通过 Reducer 生成状态快照 |
| 可回溯性 | 一般 | 极强(支持状态回滚与回溯) |
五、 总结
中小型项目/快速迭代:MVVM 是最优解,开发效率高,配合 Jetpack 套件非常成熟。
大型复杂项目/稳定性要求极高:MVI 更具优势,虽然样板代码多,但其单一状态机能有效避免 UI 状态冲突。
作者:Li Caijun
持续更新 Android 底层原理与架构实战,欢迎关注!