MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。
调用关系
数据关系
- View 接受用户交互请求
- View 将请求转交给Controller
- Controller 操作Model进行数据更新
- 数据更新之后,Model通知View更新数据变化
- View 更新变化数据
Android实现
对于原生的Android应用,MVC的角色分配如下:
View :layout里面的xml布局文件
Model:各种Java bean,一些类似repository类 等
Controller:各种Activity
缺点:
xml作为view层,控制能力实在太弱了,你想去动态的改变一个页面的背景,或者动态的隐藏/显示一个按钮,这些都没办法在xml中做,只能把代码写在activity中,造成了activity既是controller层,又是view层的这样一个窘境。如果是一个逻辑很复杂的页面,activity或者fragment动辄上千行呢?这样不仅写起来麻烦,维护起来更是噩梦。
MVC还有一个重要的缺陷,View层和Model层是相互可知的,这意味着两层之间存在耦合,耦合对于一个大型程序来说是非常致命的,因为这表示开发,测试,维护都需要花大量的精力。
正因为MVC有这样那样的缺点,所以才演化出了MVP和MVVM这两种框架。
从图中就可以看出,最明显的差别就是 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是Model-View-ViewModel的简写。最早是由微软提出的。
从图中看出,它和MVP的区别貌似不大,只不过是 Presenter 层换成了 ViewModel 层,还有一点就是 View 层和 ViewModel 层是相互绑定的关系,这意味着当你更新 ViewModel 层的数据的时候,View 层会相应的变动UI。
我们很难去说MVP和MVVM这两个MVC的变种孰优孰劣,还是要具体情况具体分析。
参考:http://blog.csdn.net/jdsjlzx/article/details/51174396