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比较笨重,维护起来会比较困难。
- 接口膨胀
Presenter
层通过接口与View
通信,实际上持有了View
的引用- 但是随着业务逻辑的增加,一个页面可能会非常复杂,这样就会造成
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 是什么
MVI
与 MVVM
很相似,其借鉴了前端框架的思想,更加强调数据的单向流动和唯一数据源,架构图如下所示
其主要分为以下几部分
Model
: 与MVVM
中的Model
不同的是,MVI
的Model
主要指UI
状态(State
)。例如页面加载状态、控件位置等都是一种UI
状态View
: 与其他MVX
中的View
一致,可能是一个Activity
或者任意UI
承载单元。MVI
中的View
通过订阅Model
的变化实现界面刷新Intent
: 此Intent
不是Activity
的Intent
,用户的任何操作都被包装成Intent
后发送给Model
层进行数据请求
单向数据流
MVI
强调数据的单向流动,主要分为以下几步:
- 用户操作以
Intent
的形式通知Model
Model
基于Intent
更新State
View
接收到State
变化刷新UI。
数据永远在一个环形结构中单向流动,不能反向流动:
上面简单的介绍了下MVI
架构,下面我们一起来看下具体是怎么使用MVI
架构的
MVI
架构实战
总体架构图
我们使用ViewModel
来承载MVI
的Model
层,总体结构也与MVVM
类似,主要区别在于Model
与View
层交互的部分
Model
层承载UI
状态,并暴露出ViewState
供View
订阅,ViewState
是个data class
,包含所有页面状态View
层通过Action
更新ViewState
,替代MVVM
通过调用ViewModel
方法交互的方式
MVI
有以下优势
- 强调数据单向流动,很容易对状态变化进行跟踪和回溯
- 使用
ViewState
对State
集中管理,只需要订阅一个ViewState
便可获取页面的所有状态,相对MVVM
减少了不少模板代码 ViewModel
通过ViewState
与Action
通信,通过浏览ViewState
和Aciton
定义就可以理清ViewModel
的职责,可以直接拿来作为接口文档使用。
当然MVI
也有一些缺点,比如
- 所有的操作最终都会转换成
State
,所以当复杂页面的State
容易膨胀 state
是不变的,因此每当state
需要更新时都要创建新对象替代老对象,这会带来一定内存开销
MVP和MVC的最大区别
在MVP中View并不直接使用Model,它们之间的通信是通过Presenter 来进行的,所有的交互都发生在Presenter内部,而在MVC中View直接从Model中读取数据而不是通过 Controller。
如何选取框架
本来是要每个模式写一个适用场景,最后想想每个人都有自己的理解,别被他人束缚了。
一句话:适合自己的才是最好的!
转自: zhuanlan.zhihu.com/p/400738449
作者:RicardoMJiang
链接:juejin.cn/post/702262…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。