下文仅代表个人了解,可能会有偏差或过错,欢迎谈论或私信评论。
MVC
从软件架构模型视点
MVC 是比较“古老”的架构模型,后面的 MV* 都是根据它进行拓宽。MVC 出现的意义是为了进步程序的可保护性与拓宽性。在 View 层与 Model 层中添加了 Controller 层作为中转层。
从完成视点
在 Android 中关于 MVC 的完成比较简单粗犷,View 层便是 xml 布局文件,Controller 层便是 Activity/Fragment。但因为 xml 布局文件功能性比较差,与 UI 有关的操作主要靠 Activity/Fragment。所以, Activity/Fragment 同时承载了 View 层与 Controller 层的使命。
优缺陷
- 长处:
- 经过分层思维区分不同责任,进步了程序的拓宽性与可保护性
- 缺陷:
- 在 Android 中因为 xml 文件功能性太低,导致 Activity/Fragment 承载了 View 与 Controller 责任,导致其复杂度太高,降低了程序可保护性。
- 三层间是互相持有,耦合度太高。
MVP
从软件架构模型视点
MVP 是从 MVC 派生出来的。Presenter 层相较于 MVC 的 Controller 层除了中转外,还承载了数据处理使命(将从 Model 层中获取的数据处理成 View 层需要的格式)。
从完成视点
在 Android 中 MVP 模型是经过接口完成的,经过界说 View 层与 Presenter 层接口,进步程序拓宽性。将页面逻辑处理至 Presenter 层,降低了 Activity/Fragment 的复杂度,进步程序的可保护性。
优缺陷
- 长处:
- 将页面逻辑抽离到 Presenter 层,降低了 Activity/Fragment 内部的复杂度,使其替代 xml 布局文件承当了 View 层使命。
- 经过面向接口开发,进步了代码拓宽性。
- 缺陷:
- View 层接口中的方法界说粒度无法确保,太细导致逻辑分散,出现”改不全”问题,太粗导致代码保护性退化。
- View 层接口仅支撑单一完成,例如 Activity 和 Fragment 需要独自完成,导致无法完成跨页面通信。
- View 层与 Presenter 层相互持有,增加了耦合度,同时因为 Presenter 层持有 View 层(Activity/Fragment) 也会存在内存泄露的风险。
- Presenter 层生命周期与 Activity 共同,无法处理屏幕旋转等场景。
MVVM
关于 MVVM 架构的了解分歧仍是蛮大的,主要有两种:
- MVVM 指的是 DataBinding
- MVVM 指的是 View(Activity/Fragment) + ViewModel(Jetpack组件) + Model
其实这两种了解都是对的,仅仅站在的视点不同。
从软件架构模型视点
MVVM 的中心便是数据绑定,凭借数据绑定将 View 层与 Model 层进行解耦。ViewModel 层的作用是一个数据中转站,担任露出 Model 层数据。所以 MVVM 也是一种数据驱动形式。
从完成视点
MVVM 在 Android 中的完成可凭借 Jetpack 组件库。但要留意区分 ViewModel 层并不是指 ViewModel 组件,怎样了解这句话呢?
假如按照严格的软件架构模型完成,那么这儿的 ViewModel 层需要依托 ViewMode + DataBinding 完成。但现在 DataBinding 在大多数的项目中落地情况不是很好,所以大部分项目是经过 ViewModel + LiveData 来完成。
优缺陷
- 长处:
- 凭借 Jetpack 组件库能够完成生命周期感应,而且 ViewModel 生命周期长于 Activity,可处理屏幕旋转等场景。
- 经过监听/绑定方法,将 View 层与 ViewModel 层进行解耦。
- 缺陷:
- 经过数据驱动的方法,而且 LiveData 仅支撑单一数据类型,导致在复杂页面时 LiveData 的保护本钱增加。
MVI
从软件架构模型视点
关于 MVI 现在没有明确的界说。主流的解说是“根据响应式编程完成的事情(状况)驱动形式”。这儿与 MVVM 的主要差异就在于,MVVM 是数据驱动,而 MVI 是事情(状况)驱动。
从完成视点
完成 MVI 模型能够经过 View + Presenter + Model 或许 View + JetPack(ViewModel + LiveData/Flow) + Model 方法都完成。关键在于 Model 层与 View 层之间的传递的状况。
怎样了解数据驱动与事情(状况)驱动呢?(以 JetPack 完成为例)
- 数据驱动:ViewModel 持有的是数据,View 经过监听数据改变触发页面逻辑。
- 事情(状况)驱动:ViewModel 持有的是页面状况,View 经过监听状况触发页面变换。
关于具体的完成,这儿引荐两个示例:
- 经过 MVP 完成 MVI(这是一篇海外博客)
- 经过 Jetpack 完成 MVI (这是 Airbnb 开源的结构)
Google 引荐结构形式
现在经过官方最新架构指南中能够发现,官方引荐经过 Jetpack 来完成 MVI 模型。
- UI Layer: 用于处理页面逻辑。内部包含了 Activity/Fragment(UI Element)、ViewModel(State Holder)
- Domain Layer: 用于处理 DataLayer 获取的数据,进步代码的复用性。
- Data Layer: 用于处理业务逻辑。内部包含了数据处理(Repositories)、数据存储(Data Sources)