简单介绍MVC、MVP和MVVM模式

时间:2021-09-01 16:51:06

说到这三个框架,应该说是所有做安卓开发的童鞋都会用到的,之前在github上看到一位大神写的相关的demo,觉得用的非常好,在此我介绍下我对这三个框架的理解:

简单介绍MVC、MVP和MVVM模式
MVC
MVC,Model View Controller,是软件架构中最常见的一种框架,简单来说就是通过controller的控制去操作model层的数据,并且返回给view层展示,当用户出发事件的时候,view层会发送指令到controller层,接着controller去通知model层更新数据,model层更新完数据以后直接显示在view层上,这就是MVC的工作原理。
对于原生的Android项目来说,layout.xml里面的xml文件就对应于MVC的view层,里面都是一些view的布局代码,而各种java bean,还有一些类似repository类就对应于model层,至于controller层,当然就是各种activity和fragment。套用我上面说的MVC的工作原理来理解,比如你的界面有一个按钮,按下这个按钮去网络上下载一个文件,这个按钮是view层的,是使用xml来写的,而那些和网络连接相关的代码写在其他类里,比如你可以写一个专门的networkHelper类,这个就是model层,那怎么连接这两层呢?是通过button.setOnClickListener()这个函数,这个函数就写在了activity中,对应于controller层。
那么MVC框架有什么缺点呢?问题就在于xml作为view层,控制能力实在太弱了,你想去动态的改变一个页面的背景,或者动态的隐藏/显示一个按钮,这些都没办法在xml中做,只能把代码写在activity中,造成了activity既是controller层,又是view层的情况。如果是一个逻辑很复杂的页面,activity或者fragment本身已经写了很复杂了,这样修改起来不仅麻烦,而且后期很难维护。MVC还有一个重要的缺陷就是view层和model层是相互可知的,这意味着两层之间存在耦合,高耦合对于一个大型程序来说是非常致命的,因为这表示开发,测试,维护都需要花大量的精力。
简单介绍MVC、MVP和MVVM模式
MVP
MVP,Model View Presenter,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)的一个控制器。
简单介绍MVC、MVP和MVVM模式
MVVM
MVVM,Model View ViewmodelModel,它和MVP的区别貌似不大,只是presenter层换成了viewmodel层,还有一点就是view层和viewmodel层是相互绑定的关系,这意味着当你更新viewmodel层的数据的时候,view层会相应的变动ui。
备注
因为本人几个项目里面只用过MVC、MVP框架,所以只能简单的介绍下那么多,有感兴趣的童鞋可以去大神的github上看下:
贴出来大神写的关于这三个框架的demo的GitHub地址