相信你们对MVC,MVP和MVVM都不陌生,做为三个最耳熟能详的Android框架,它们的应用能够是很是普遍的,可是对于一些新手来讲,可能对于区分它们三个都有困难,更别说在实际的项目中应用了,有些时候想用MVP的,代码写着写着就变成了MVC,长此以往就对它们三个的选择产生了恐惧感,若是你也是这样的人群,那么这篇文章可能会对你有很大的帮助,但愿你们看完都会有收获吧!php
文章重点:java
(1)了解并区分MVC,MVP,MVVM。git
(2)知道这三种模式在Android中如何使用。程序员
(3)走出data binding的误区。github
(4)了解MVP+data binding的开发模式。网络
本篇文章的demo我将会上传到个人github上。架构
正如庄子在逍遥游中说的,若是水不够深,那就没有可以担负大船的力量 。因此在真正开始涉及具体的代码以前,咱们要先对MVC,MVP和MVVM作一个初步的了解。若是各位同窗对此已经有所了解了,能够选择性跳过这一节。mvc
MVC,Model View Controller,是软件架构中最多见的一种框架,简单来讲就是经过controller的控制去操做model层的数据,而且返回给view层展现,具体见下图框架
当用户出发事件的时候,view层会发送指令到controller层,接着controller去通知model层更新数据,model层更新完数据之后直接显示在view层上,这就是MVC的工做原理。mvvm
那具体到Android上是怎么样一个状况呢?
你们都知道一个Android工程有什么对吧,有java的class文件,有res文件夹,里面是各类资源,还有相似manifest文件等等。对于原生的Android项目来讲,layout.xml里面的xml文件就对应于MVC的view层,里面都是一些view的布局代码,而各类java bean,还有一些相似repository类就对应于model层,至于controller层嘛,固然就是各类activity咯。你们能够试着套用我上面说的MVC的工做原理是理解。好比你的界面有一个按钮,按下这个按钮去网络上下载一个文件,这个按钮是view层的,是使用xml来写的,而那些和网络链接相关的代码写在其余类里,好比你能够写一个专门的networkHelper类,这个就是model层,那怎么链接这两层呢?是经过button.setOnClickListener()这个函数,这个函数就写在了activity中,对应于controller层。是否是很清晰。
你们想过这样会有什么问题吗?显然是有的,否则为何会有MVP和MVVM的诞生呢,是吧。问题就在于xml做为view层,控制能力实在太弱了,你想去动态的改变一个页面的背景,或者动态的隐藏/显示一个按钮,这些都没办法在xml中作,只能把代码写在activity中,形成了activity既是controller层,又是view层的这样一个窘境。你们回想一下本身写的代码,若是是一个逻辑很复杂的页面,activity或者fragment是否是动辄上千行呢?这样不只写起来麻烦,维护起来更是噩梦。(固然看过Android源码的同窗其实会发现上千行的代码不算啥,一个RecyclerView.class的代码都快上万行了呢。。)
MVC还有一个重要的缺陷,你们看上面那幅图,view层和model层是相互可知的,这意味着两层之间存在耦合,耦合对于一个大型程序来讲是很是致命的,由于这表示开发,测试,维护都须要花大量的精力。
正由于MVC有这样那样的缺点,因此才演化出了MVP和MVVM这两种框架。
MVP做为MVC的演化,解决了MVC很多的缺点,对于Android来讲,MVP的model层相对于MVC是同样的,而activity和fragment再也不是controller层,而是纯粹的view层,全部关于用户事件的转发所有交由presenter层处理。下面仍是让咱们看图
从图中就能够看出,最明显的差异就是view层和model层再也不相互可知,彻底的解耦,取而代之的presenter层充当了桥梁的做用,用于操做view层发出的事件传递到presenter层中,presenter层去操做model层,而且将数据返回给view层,整个过程当中view层和model层彻底没有联系。看到这里你们可能会问,虽然view层和model层解耦了,可是view层和presenter层不是耦合在一块儿了吗?其实不是的,对于view层和presenter层的通讯,咱们是能够经过接口实现的,具体的意思就是说咱们的activity,fragment能够去实现实现定义好的接口,而在对应的presenter中经过接口调用方法。不只如此,咱们还能够编写测试用的View,模拟用户的各类操做,从而实现对Presenter的测试。这就解决了MVC模式中测试,维护难的问题。
固然,其实最好的方式是使用fragment做为view层,而activity则是用于建立view层(fragment)和presenter层(presenter)的一个控制器。
MVVM最先是由微软提出的
这里要感谢泡在网上的日子,由于前面看到的三张图我都是从它的博客中摘取的,若是有人知道不容许这样作的话请告诉我,我会从个人博客中删除的,谢谢。
从图中看出,它和MVP的区别貌似不大,只不过是presenter层换成了viewmodel层,还有一点就是view层和viewmodel层是相互绑定的关系,这意味着当你更新viewmodel层的数据的时候,view层会相应的变更ui。
咱们很难去说MVP和MVVM这两个MVC的变种孰优孰劣,仍是要具体状况具体分析。
对于程序员来讲,空谈是最没效率的一种方式,相信你们看了我上面对于三种模式的分析,或多或少都会有点云里雾里,下面让咱们结合代码来看看。
让咱们试想一下下面这个情景,用户点击一个按钮A,获取github上对应公司对应仓库中贡献排行第一的任的名字,而后咱们还会有一个按钮B,用户点击按钮B,界面上排行第一的那我的的名字就会换成本身的。