一、MVC

MVC的全称是Model-View-Controller,也就是模型-视图-控制器。

在Android中View层一般由XML布局文件充当。在Model层中我们会进行一些数据处理的工作,比如网络数据请求、数据库操作等。Controller层通常由Activity、Fragment充当,并在其中进行界面、数据相关的业务处理。

可见在Android中,作为Controller的Activity或Fragment主要起到的作用就是解耦,将View和Model进行分离,两者在Activity中完成具体的操作。

下图是MVC架构的结构模型:

MVC 模型

从图中可以看出,MVC的耦合性还是相对较高的,View和Model之间可以互相访问,导致三者间构成回路,同时核心的业务逻辑都写在Controller中,导致Controller中的代码略显臃肿,这也是我们开发中使用MVC模式所面对的问题,Activity或Fragment中的业务逻辑代码代码少则几百行多则上千行。

二、MVP

MVP是MVC架构的一个演化版,全称是Model-View-Presenter。

和MVC架构相比,MVP架构在Android中场景应该是这样的,Model层同样提供数据操作的功能,但View层的职责由Activity、Fragment、或某个View控件担任,最后Presenter层作为View层和Model层沟通的中介。

通常在View层中,有一个Presenter成员变量,同时我们的View(可以是Activity、Fragment)需要实现一个接口,这样可以将View层中需要的业务逻辑操作通过该接口转交给Presenter来实现,进而Presenter通过Model得到相应的数据,并通过View层实现的接口返回到View中。这样View层和Model层的耦合就解除了,同时也将业务逻辑从View中抽离出来,转移到Presenter中,避免了Activity或Fragment过度臃肿,充斥大量业务逻辑代码。

MVP的结构模型如下:

MVP 模型

从图中可以看出,MVP架构中,解除了View和Model间的耦合,使它们不能相互访问,核心的业务逻辑都集中在Presenter中。

随着产品的升级,UI会添加新的设计,业务逻辑也会更改,在MVC架构中,我们需要在View层处理这些变化,可是面对成百上千的代码,也是挺烦的。使用MVP架构能很好的降低View的复杂性,将业务逻辑分离到Prestener,它们之间通过接口通信,处理变化时只需要根据情况来扩展接口并在Prestener处理新的业务逻辑即可。

所以可以看出,MVP架构还是相当优良的,对于相对大的项目,它能够很好的组织处理应用的结构,使应用更加易于扩展、更加灵活。如果应用相对简单的话,使用MVP架构就相对复杂麻烦,有点小题大做的感觉。

三、MVVM

MVVM的结构模型如下:

MVVM 模型

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

工作原理和我们Android中的Adapter有些类似,可以这样想象一下,在使用RecyclerView时,Adapter扮演ViewModel的角色,RecyclerView当然是View的角色、数据集合则是Model的角色,当数据集发生变化时,我们会调用Adapter类的notifyXXX()方法,RecyclerView列表就会得到更新,如果RecyclerView列表是可编辑的,例如删除Item等,这些操作也是会影响原始数据集的。所以ViewModel就是View和Model之间沟通的桥梁,解决了View和Model之间的耦合问题,让操作变得更加灵活、方便。