MVC

Model:实体类(数据的获取、存储、数据状态变化)。
View:布局文件
Controller:Activity(处理数据、业务和UI)。
![](https://image.zfxt.top/hexo-blog/MVC MVP MVVM MVI架构-2023-10-12-22-10.png)
缺点:
随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。
为了解决MVC的缺点,MVP 框架被提出来。

MVP

Model:实体类(数据的获取、存储、数据状态变化)。
View:布局文件+Activity。
Presenter:中介,负责完成View与Model间的交互和业务逻辑。
![](https://image.zfxt.top/hexo-blog/MVC MVP MVVM MVI架构-2023-10-14-08-28.png)

  • MVP的优点

复杂的逻辑处理放在Presenter进行处理,减少了Activity的臃肿。
解耦。Model层与View层完全分离,修改V层不会影响M层,降低了耦合性。
可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。
Presenter层与View层的交互是通过接口来进行的,便于单元测试。

  • MVP的缺点

维护困难。Presenter中除了业务逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,造成Presenter比较笨重,维护起来会比较困难。
接口膨胀

MVVM

Model:实体类(数据的获取、存储、数据状态变化)。
View:布局文件+Activity。
ViewModel: 关联层,将Model和View进行绑定,Model或View更改时,实时刷新对方。
![](https://image.zfxt.top/hexo-blog/MVC MVP MVVM MVI架构-2023-10-15-20-41.png)

  1. 提高可维护性。Data Binding可以实现双向的交互,使得视图和控制层之间的耦合程度进一步降低,分离更为彻底,同时减轻了Activity的压力。
  2. 简化测试。因为同步逻辑是交由Binder做的,View跟着Model同时变更,所以只需要保证Model的正确性,View就正确。大大减少了对View同步更新的测试。
  3. ViewModle易于单元测试。

MVI

Model: 与MVVM中的Model不同的是,MVI的Model主要指UI状态(State)。例如页面加载状态、控件位置等都是一种UI状态
View: 与其他MVX中的View一致,可能是一个Activity或者任意UI承载单元。MVI中的View通过订阅Model的变化实现界面刷新
Intent: 此Intent不是Activity的Intent,用户的任何操作都被包装成Intent后发送给Model层进行数据请求
![](https://image.zfxt.top/hexo-blog/MVC MVP MVVM MVI架构-2023-10-18-27-35.png)

单向数据流

MVI强调数据的单向流动,主要分为以下几步:
![](https://image.zfxt.top/hexo-blog/MVC MVP MVVM MVI架构-2023-10-19-11-25.png)

  1. 用户操作以Intent的形式通知Model
  2. Model基于Intent更新State
  3. View接收到State变化刷新UI。

![](https://image.zfxt.top/hexo-blog/MVC MVP MVVM MVI架构-2023-10-19-48-07.png)
MVI有以下优势

强调数据单向流动,很容易对状态变化进行跟踪和回溯
使用ViewState对State集中管理,只需要订阅一个 ViewState 便可获取页面的所有状态,相对 MVVM 减少了不少模板代码
ViewModel通过ViewState与Action通信,通过浏览ViewState 和 Aciton 定义就可以理清 ViewModel 的职责,可以直接拿来作为接口文档使用。

当然MVI也有一些缺点,比如

所有的操作最终都会转换成State,所以当复杂页面的State容易膨胀
state是不变的,因此每当state需要更新时都要创建新对象替代老对象,这会带来一定内存开销

该文引用自(稀土掘金)[https://juejin.cn/post/7043716896767606798]