MVC、MVP和MVVM

MVC

1、简介

MVC全名是Model View Controller,用一种业务逻辑、数据、界面显示分离的分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。如图所示。

mvc.png

其中,

Model:处理数据、业务逻辑等。

View:处理界面的显示结果。

Controller:起到桥梁的作用,来控制V和M层通信,达到分离视图显示和业务逻辑层。

2、在Android中

Model: 业务模型,建立的数据结构和相关的类。对数据库的操作、对网络等的操作都应该在Model里面处理。

View: 一般采用XML文件进行界面的描述。

Controller:通常由Activity承担。这句话也就暗含了不要在Activity中写逻辑代码,要通过Activity交割给Model业务逻辑层处理,这样做的另外一个原因是Android中的Actiivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。

3、优缺点

  • 优点

代码结构简单,所有通信是单向的。

  • 缺点

(1)xml作为view层,控制能力实在太弱了。你想去动态的改变一个页面的背景,或者动态的隐藏/显示一个按钮,这些都没办法在xml中做,只能把代码写在activity中,造成了activity既是controller层,又是view层的这样一个窘境。

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

(3)view层和model层是相互可知的,这意味着两层之间存在耦合。

MVP

1、简介

MVP与MVC有一定的相似性:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。如图所示。

mvp.png

2、在Android中

Model: 负责存储、检索、操作数据, 可以实现一个Model interface用来降低耦合。

View: 负责绘制UI元素、与用户进行交互,体现为Activity、Fragment等。可以实现一个View interface来降低耦合,方便进行单元测试。

Presenter: 作为View与Model交互的中间纽带,处理与用户交互逻辑。

数据流方向:V -> P -> M -> P -> C

3、优缺点

  • 优点

(1)模型与视图完全分离,我们可以修改视图而不影响模型。

(2)可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部。

(3)一个Presenter用于多个视图,方便单元测试。

  • 缺点

(1)P层与V层是通过接口进行交互,接口粒度不好控制。粒度太小,就会存在大量接口的情况,使代码太过碎片化。粒度太大,解耦效果不好。

(2)MVP是以UI为驱动的模型,更新UI都需要保证能获取到控件的引用,同时更新UI的时候要考虑当前是否是UI线程,也要考虑Activity的生命周期

(3)复杂的业务同时也可能会导致P层太大,最终P层代码过于臃肿。

MVVM

1、简介

MVVM可以当作MVP的升级版,其中的VM是ViewModel的缩写,ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModel和View之间的交互通过Data Binding完成,而Data Binding可以实现双向的交互,这就使得视图和控制层之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力。如图所示。

mvvm.png

2、在Android中

Model: 与MVP的Model类似,数据对象,提供数据操作的接口,同时在数据变化时发出变更通知。

View:与MVP的View类似,UI层,展示界面。

ViewModel:指View的Model,包含View的一些数据属性和操作,关键技术是数据绑定DataBinding, View的变化直接影响ViewModel, ViewModel的变化或者内容会直接体现在View上。

3、优缺点

  • 优点

(1)双向绑定技术,当Model变化时,View-Model会自动更新,View也会自动变化,很好做到数据的一致性。

  • 缺点

(1)数据绑定使得 Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。

(2)不利于代码重用。客户端开发最常用的重用是View,但是数据双向绑定技术,让你在一个View都绑定了一个model,不同模块的model都不同。

参考文章

Android App的设计架构:MVC, MVP, MVVM

Android App的设计架构:MVC,MVP,MVVM与架构经验谈

MVVM的优点和缺点

猜你喜欢

转载自blog.csdn.net/zhanhong39/article/details/82316612