MVC MVP MVVM MVI架构优缺点

4,066 阅读6分钟

MVC是什么?

Android中的MVC含义

  • Model:实体类(数据的获取、存储、数据状态变化)。
  • View:布局文件
  • Controller:Activity(处理数据、业务和UI)。

工作原理

  • View接受用户的交互请求。
  • View将请求转交给Controller。
  • Controller操作Model进行数据更新。
  • 数据更新之后,Model通知View数据变化。
  • View显示更新之后的数据。

MVC的缺点

随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。

为了解决MVC的缺点,MVP 框架被提出来。

MVP是什么

MVP是MVC架构的一个演化版,将MVC中的V和C结合生成MVP中的V,引入新的伙伴Presenter。

Android中的MVP含义

  • Model:实体类(数据的获取、存储、数据状态变化)。
  • View:布局文件+Activity。
  • Presenter:中介,负责完成View与Model间的交互和业务逻辑。

工作原理

  • View 接收用户交互请求
  • View 将请求转交给 Presenter(V调用P接口)
  • Presenter 操作Model进行数据更新(P调用M接口)
  • Model 通知Presenter数据发生变化(M调用P接口)
  • Presenter 更新View数据(P执行接口,V相应回调)

MVP的优点

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

MVP的缺点

  • 维护困难。Presenter中除了业务逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,造成Presenter比较笨重,维护起来会比较困难。
  • 接口膨胀
  1. Presenter层通过接口与View通信,实际上持有了View的引用
  2. 但是随着业务逻辑的增加,一个页面可能会非常复杂,这样就会造成View的接口会很庞大。

MVVM是什么

MVVM与MVP的结构很相似的,就是将Presenter升级为ViewModel。在MVVM中,View层和Model层进行了双向绑定(即Data Binding),所以Model数据的更改会表现在View上,反之亦然。ViewModel就是用来根据具体情况处理View或Model的变化。

Android中的MVVM含义

  • Model:实体类(数据的获取、存储、数据状态变化)。
  • View:布局文件+Activity。
  • ViewModel: 关联层,将Model和View进行绑定,Model或View更改时,实时刷新对方。

工作原理

  • View 接收用户交互请求
  • View 将请求转交给ViewModel
  • ViewModel 操作Model数据更新
  • Model 更新完数据,通知ViewModel数据发生变化
  • ViewModel 更新View数据

View/Model的变动,只要改其中一方,另一方都能够及时更新到

MVVM的优点

1.提高可维护性。Data Binding可以实现双向的交互,使得视图和控制层之间的耦合程度进一步降低,分离更为彻底,同时减轻了Activity的压力。

2.简化测试。因为同步逻辑是交由Binder做的,View跟着Model同时变更,所以只需要保证Model的正确性,View就正确。大大减少了对View同步更新的测试。

3.ViewModle易于单元测试。

MVVM的缺点

1.对于简单的项目,使用MVVM有点大材小用。

2.对于过大的项目,数据绑定会导致内存开销大,影响性能。

3.ViewModel和View的绑定,使页面异常追踪变得不方便。有可能是View出错,也有可能是ViewModel的业务逻辑有问题,也有可能是Model的数据出错。

MVI 是什么

MVIMVVM 很相似,其借鉴了前端框架的思想,更加强调数据的单向流动和唯一数据源,架构图如下所示

其主要分为以下几部分

  1. Model: 与MVVM中的Model不同的是,MVIModel主要指UI状态(State)。例如页面加载状态、控件位置等都是一种UI状态
  2. View: 与其他MVX中的View一致,可能是一个Activity或者任意UI承载单元。MVI中的View通过订阅Model的变化实现界面刷新
  3. Intent: 此Intent不是ActivityIntent,用户的任何操作都被包装成Intent后发送给Model层进行数据请求

单向数据流

MVI强调数据的单向流动,主要分为以下几步:

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

数据永远在一个环形结构中单向流动,不能反向流动:

上面简单的介绍了下MVI架构,下面我们一起来看下具体是怎么使用MVI架构的

MVI架构实战

总体架构图


我们使用ViewModel来承载MVIModel层,总体结构也与MVVM类似,主要区别在于ModelView层交互的部分

  1. Model层承载UI状态,并暴露出ViewStateView订阅,ViewState是个data class,包含所有页面状态
  2. View层通过Action更新ViewState,替代MVVM通过调用ViewModel方法交互的方式

MVI有以下优势

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

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

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

MVP和MVC的最大区别

在MVP中View并不直接使用Model,它们之间的通信是通过Presenter 来进行的,所有的交互都发生在Presenter内部,而在MVC中View直接从Model中读取数据而不是通过 Controller。

如何选取框架

本来是要每个模式写一个适用场景,最后想想每个人都有自己的理解,别被他人束缚了。

一句话:适合自己的才是最好的!

转自: zhuanlan.zhihu.com/p/400738449


作者:RicardoMJiang
链接:juejin.cn/post/702262… 来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。