前言
MVC、MVP和MVVM是Android耳熟能详的三个模式,且应用广泛。对于三者的内容、区别、使用场景有时很能道出个123,而且这些框架思想在各个平台都有,但对于各个平台具体的实现有一定差异和限制。本文主要从Android方面来介绍它们。主要有:
- 了解并区分MVC、MVP和MVVM;
- 它们在Android中如何使用;
- 走出data binding的误区;
- 理解MVP+data binding开发模式;
MVC、MVP和MVVM基础介绍
水之积也不厚,则其负大舟也无力:正如庄子逍遥游所说,水不深则没有能够担负大船的力量。在涉及代码前,我们需要对MVC、MVP和MVVM有足够的了解。
MVC
MVC:(Model View Controller)是软件架构中常见的一种模式,其通过controller层的控制去操作model层的数据,并且返回给view层展示,具体如下:
其工作原理为:当用户触发事件的时候,view层会发送指令到controller层,接着controller去通知model层更新数据,model层更新晚数据以后直接显示在view层。
那具体到android上又是如何?,我们知道android工程有java的class文件、有res文件夹、asset、还有manifest文案等等,对于原生的android项目来说,layout.xml里面的xml
文件就对应于MVC的view层,而各种java bean、还有类是repository类就是对应于model层,至于controller层,则是各种activity。当我们在页面触发一个按钮去加载网络资源时,加载网络资源xiangg代码和结果类,则是model层,view和model的关联则是通过按钮的点击事件,这个在activity中,也就是contrller层。android中完整的MVC流程就是这样。
Android这样处理有何问题?显然有的。问题在于xml作为view层,其控制
内里太弱,当要改变一个页面的背景或者动态控制按钮的隐藏或显示,这些都只能在activity中控制,这样
activity的cotroller职责就多了。不符合六大原子的 单一原则。
通过以上我们知道MVC重要的缺陷是view层和model层是相互可知,意味着两层之间存在耦合。这是因为这个缺陷,才演化出MVP和MVVM两种框架。
MVP
MVP(View、Presenter、model)作为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
MVVM(View、ViewModel、Model)最早有微软提供的,其原理图如下:
由图可知,其和MVP的区别不到,只不过是presenter层换成viewmodel层,还有就是view层和viewmodel层是相互绑定的关系,意味着当更新viewmodel层的数据的时候,view层会相应的变动ui。
很难说MVP和MVVM这两个MVC的变种孰优孰劣,需要具体分析。
纸上得来终觉浅,绝知此事要躬行
路漫漫其修远兮,吾将上下而求索
参考地址:
[1].MVC、MVP、MVVM详解 https://blog.csdn.net/jdsjlzx/article/details/51174396
[2].MVC在Android中的使用 https://blog.csdn.net/feiduclear_up/article/details/46363207
[3].Android中常见的MVC模式 https://blog.csdn.net/sylcc_/article/details/7346149
[4].MVC,MVP,MVVM与架构经验谈 https://www.cnblogs.com/wytiger/p/5305087.html
[5].平台间的MVC、MVP、MVVM http://www.cnblogs.com/indream/p/3602348.html
[6].前端MVC、MVP、MVVM http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html