安卓中 mvc 和 mvp 和 mvvm 和 MVI 及 clean 架构的区别和优劣

227 阅读3分钟

在安卓开发里,MVC、MVP、MVVM、MVI 以及 Clean 架构是几种常用的设计模式,它们各有特点,下面来详细分析它们的区别、优点和缺点。

MVC(Model-View-Controller)

结构划分

  • Model:负责处理数据和业务逻辑。

  • View:对应布局文件(XML),负责界面展示。

  • Controller:一般由 Activity/Fragment 充当,负责协调 View 和 Model 之间的交互。

优势

  • 结构清晰,易于理解,适合初学者入门。

  • 是 Android 原生支持的架构模式。

劣势

  • Activity/Fragment 承担了过多的职责,代码变得臃肿,维护难度加大。
  • View 和 Controller 之间的耦合度高,单元测试困难。

MVP(Model-View-Presenter)

结构划分

  • Model:负责数据和业务逻辑。

  • View:由接口定义,通常由 Activity/Fragment 实现,专注于界面展示。

  • Presenter:作为 View 和 Model 的中间桥梁,处理业务逻辑,避免 View 直接与 Model 交互。

优势

  • 降低了 View 和 Model 之间的耦合度,提高了代码的可测试性。

  • 职责划分更加明确,便于代码的维护和扩展。

劣势

  • 会产生大量的接口,增加了代码的复杂度。
  • Presenter 可能会变得庞大,尤其是在处理复杂业务逻辑时。

MVVM(Model-View-ViewModel)

结构划分

  • Model:负责数据和业务逻辑。

  • View:对应布局文件(XML)或 Activity/Fragment。

  • ViewModel:借助 Data Binding 或 LiveData 与 View 进行数据绑定,处理业务逻辑。

优势

  • 实现了 View 和 Model 的分离,提高了代码的可维护性。

  • 通过数据绑定减少了模板代码,提升了开发效率。

  • 便于进行单元测试。

劣势

  • Data Binding 可能会掩盖一些数据流动的问题,增加调试难度。
  • ViewModel 可能会包含复杂的逻辑,导致其变得臃肿。

MVI(Model-View-Intent)

结构划分

  • Model:是一个不可变的状态容器,存储界面状态。

  • View:仅负责渲染状态,将用户操作转化为 Intents。

  • Intent:代表用户的操作,经过处理后更新 Model。

优势

  • 单向数据流使得数据流向清晰,便于调试。

  • 状态不可变,减少了竞态条件的出现。

  • 天然支持单元测试和 UI 自动化测试。

劣势

  • 学习曲线较陡,需要理解函数响应式编程的概念。
  • 可能会产生大量的状态类和 Intent 类,增加代码量。

Clean Architecture(整洁架构)

结构划分

  • Entities:包含企业级业务规则,是最核心、最独立的部分。

  • Use Cases:处理应用程序的特定业务逻辑,也被称为 Interactors。

  • Repositories:定义数据获取的接口,由具体的实现类(如网络或数据库)来实现。

  • Presenters/ViewModels:与 UI 层进行交互。

优势

  • 高度解耦,代码的可测试性和可维护性强。

  • 依赖倒置原则得到贯彻,外部层依赖于抽象而非具体实现。

  • 便于团队分工协作。

劣势

  • 实现复杂度高,需要创建多个抽象层。
  • 对于小型项目来说,可能会显得过于重量级。

对比总结

架构模式耦合度可测试性代码复杂度适用场景
MVC小型项目
MVP中型项目
MVVM大型项目
MVI复杂交互场景
Clean极低极高极高大型复杂项目

选择建议

  • 初学者或小型项目:可以选择 MVC 或 MVP 架构。

  • 需要高可测试性的项目:MVVM 或 MVI 架构是不错的选择。

  • 大型复杂项目:建议使用 MVVM + Clean Architecture 的组合,以实现更好的分层和解耦。

  • 复杂交互场景:MVI 架构能够更好地应对这种情况。

在实际开发中,也可以根据项目的需求将不同的架构模式混合使用。例如,在 MVVM 架构中引入 MVI 的单向数据流思想,或者在 Clean Architecture 中使用 MVVM 作为表现层。