Android APP架构设计——MVC、MVP和MVVM介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SEU_Calvin/article/details/52909755

0. 前言

为了更好地进行移动端架构设计,我们最常用的就是MVCMVPMVVM,作为三个最耳熟能详的三大架构,应用可谓非常广泛。本文原创,转载请注明出处为SEU_Calvin的博客。本篇博客将介绍这三种架构设计的工作原理以及优缺点,以及它们在Android中的表现。

 

1.   MVC

1.1    MVC工作原理

MVC是软件架构中最常见的一种框架,三个字母分别代表三个模块:ModelViewController

MVC的工作原理:当用户触发事件后,View层会发送指令到Controller层,接着后者会去通知Model层更新数据,更新完数据后Model会通知View层数据的变化,并将新数据显示在View上,具体见下图,可见MVC把应用程序的逻辑层与界面层完全解耦。

ViewController使用策略模式实现,View使用组合模式实现,ViewModel通过观察者模式同步信息。



1.2    Android中的MVC

可以说Android App原本就是MVC的,View对应布局文件XmlController对应ActivityModel对应数据库、网络请求、业务计算等操作 举个简单的例子,按下界面上的一个Button去网络上下载一个文件,这个按钮是View层的,我们是通过Xml来定义的,而网络请求等复用性很高的相关代码写在一个专门的DownloadHelper类中,其实这就是我们所说的Model层,最后通过button.setOnClickListener()函数将View层和Model层联系起来,这个函数就写在了Activity中,即Controller层的实现。


1.3    MVC的缺点

MVC架构在Android中是存在很明显的缺点的,问题就在于View层的XML控制力实在是太弱了,众多View层的处理(比如在恰当的时刻控制某个控件的Visibility属性)最终都放在了Activity中去做,这样Activity有时候过于臃肿了,从而导致Activity既包含了View又包含了Controller两层之间耦合高,不利于维护拓展,可读性也变差。同时从上图MVC的工作原理中也发现View层和Model层之间也存在耦合

正因为MVC存在的上述问题,所以才演化出了MVPMVVM这两种架构。


2.  MVP

2.1    MVP工作原理

MVP是软件架构中最常见的一种框架,三个字母分别代表三个模块:ModelViewPresenter

Model:该角色主要是提供数据的存取功能。Presenter通过它来存储、获取数据。对应于项目中封装了数据库DAO或者网络获取数据的角色。

View:通常指ActivityFragment或者某个View控件。它含有一个Presenter成员变量,通常View需要实现一个接口,View操作都交给Presenter去实现。

PresenterViewModel的桥梁。它从Model层检索数据后返回给View层,使得ViewModel没有耦合,同时也将业务逻辑从View层中抽离出来。

MVP的工作原理:当View接受用户的交互请求后,将请求转交给Presenter Presenter操作Model进行数据更新 ,更新之后Model通知Presenter数据发生变化 ,最后Presenter通知View显示新数据 具体见下图。



2.2    MVPMVC的区别

很明显地相对于MVC来说View Model 不再发生联系,都通过Presenter 传递

那么为了防止View层和Presenter层出现耦合,对于View层和Presenter层的通信,我们是可以通过接口实现的,具体的意思就是说我们的ActivityView层)可以去实现定义好的接口,而在对应的Presenter中通过接口调用方法从而操作View。具体可以从2.3中给出的例子中感受到。为了确保文章的实时更新,实时修改可能出错的地方,请确保这篇是原文,而不是无脑转载来的“原创文”,原文链接为:http://blog.csdn.net/seu_calvin/article/details/52909755


2.3    MVPAndroid中的使用示例

为了控制本篇的篇幅,实例介绍在Android APP架构设计——MVP的使用示例中给出,请查看。


2.4    MVP的优点

从2.3中的例子我们可以感受到,MVP极大简化了Activity中的代码,将复杂的逻辑代码提取到了Presenter进行处理。与之对应的好处就是,各层之间的耦合度更低,更方便的进行测试,解决了MVC中维护难的问题。

 

2.5    MVP存在的问题

1MVP的问题之一在于,由于我们使用了接口的方式去连接View层和Presenter,如果有一个逻辑很复杂的页面,接口会有很多维护接口的成本会很大。这个问题通过以下方案缓解:定义一些基类接口,把一些公共的逻辑,比如网络请求成功失败,toast等放在里面,之后你再定义新的接口时可以继承自这些基类。

2)由于Presenter 经常性的持有Activity 的强引用,如果在一些请求结束之前Activity 被销毁了,Activity对象将无法被回收,此时就会发生内存泄露。解决方案已经在2.3中的链接文中给出了。


3.  MVVM

3.1  MVVM工作原理

MVVM(Model-View-ViewModel)MVVMMVP的区别其实不大,只不过是把Presenter层换成了ViewModel层,再有就是View层和ViewModel层是双向绑定的关系,当我们更新ViewModel层的数据的时候,View层会相应的更新UIMVVMAndroid中的实现方式是通过data-binding框架来做的,如果具体不了解该如何使用,可以参考这篇文章,这里就不做赘述了。为了确保文章的实时更新,实时修改可能出错的地方,请确保这篇是原文,而不是无脑转载来的“原创文”,原文链接为:http://blog.csdn.net/seu_calvin/article/details/52909755



3.2  MVVM存在的问题

1)数据绑定使得 Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,定位问题变得更麻烦。 
2)对于过大的项目,数据绑定需要花费更多的内存


关于APP的架构设计就介绍到这吧,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52909755

最后天冷了大家多加衣服~ 也请大家多点下面的“顶”支持~

猜你喜欢

转载自blog.csdn.net/SEU_Calvin/article/details/52909755