推荐阅读:
重学安卓:是让人提神醒脑的 MVP、MVVM 关系精讲!
iOS架构

常见模型

网上关于 MVC,MVP,MVVM 的主流的模型示意图如上,为了方便理解,不要拘泥于上图的形式。

MVC

对于不同技术栈的开发者来说,对 MVC 的理解是不同的。

作为 Android 开发者,我们可以简单理解 Android SDK 提供的框架认为是 MVC,将所有逻辑写在 Activity 中的操作就像 MVC。

此时 Activity 同时充当 Controller 和 View 的角色,并且二者的代码都写在一起。

缺点

  • 所有内容都写在 Activity 中,太臃肿
  • 逻辑复用困难
  • 实现更替困难

MVP

适用于面向实体或虚拟用户接口的开发。
**

它主要是在 MVC 的背景下,通过 依赖倒置,来解决 逻辑复用 难、实现更替 难 的问题。

MVP 在 Android 中与 MVC 没有本质的区别,只不过写法不同。

MVP 有着不同的写法,但本质上都是拆分 View 和 Controller:

  • 拆 Controller 为 Presenter,将调度部分从 Activity 分离
  • 拆 View,将 View 的显示部分从 Activity 分离

面向接口编程

关于依赖倒置,可以简单理解为 java 的 向上转型 + 抽象调用,也即,去调用接口类型的对象,而非具体类型的对象,从而得以 通过同一套接口方法 去访问不同的实现

image.png

优点

在 MVP 下,UI 逻辑和业务逻辑全在 Presenter 中写,UI 和 Model 的实现 可以随意替换。

MVC MVP MVVM 等架构的理解 - 图2

如上图,通过同一套 Presenter 中的逻辑,可以驱动不同品牌不同型号的耳机的线控。(注意 UI 的全称是 「用户接口」,台湾的术语更准确,叫「用户介面」。UI 不是狭义上的页面,UI 就是 UI)

缺点

  • 不好保证视图调用的一致性
  • 不好保证视图 null 安全

这里没有说无法保证视图调用的一致性和视图 null 安全,因为可以使用 MVP 配合 Android Jetpack 可感知生命周期的组件来解决上述问题。

MVVM

普遍的理解为:MVVM 是加了数据绑定的 MVP。MVC 和 MVP 偏向于架构,MVVM 更像是框架

专用于页面开发。**

它主要是在多人协作的软件工程的背景下,通过只操作 ViewModel 中映射的视图数据 来刷新视图状态,以此来解决 视图调用的一致性 问题 从而规避不可预期的错误。

表现数据,来源服务器,本地数据库,内存等。

Android 开发者的工作可以简单抽象为将数据转为表现数据进而绘制 UI。

Jetpack MVVM

Jetpack MVVM 是 MVVM 模式在 Android 开发中的一个具体落实,也即它不仅仅包含了 MVVM 模式用于解决 「视图调用的一致性问题」 这一本质,还兼顾了 Android 页面开发中其他不可预期的错误。

总结

MVP 的特质是依赖倒置,通过面向接口编程解决了逻辑复用难,实现更替难的问题。
MVVM 的特质是数据驱动,通过操作 ViewModel 中的表现数据来刷新 UI,解决 视图调用的一致性问题

MVP 更偏向于 架构,适用于面向实体或虚拟用户接口的开发;MVVM 更偏向于 框架,专用于页面开发。

框架/架构 没有优劣之分,更重要的是是否适合。对框架/架构的理解也没有标准答案,要有着自己的见解,不要人云亦云。
**

本文关于 MVP 和 MVVM 的描述摘自 重学安卓:是让人提神醒脑的 MVP、MVVM 关系精讲!