经典回答
MVC 模式
全名是Model–View–Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中 Model 层处理数据,业务逻辑等;View 层处理界面的显示结果;Controller 层起到桥梁的作用,来控制 View 层和 Model 层通信以此来达到分离视图显示和业务逻辑层。
我们往往把 Android 中界面部分的实现也理解为采用了 MVC 框架,常常把 Activity 理解为 MVC 模式中的 Controller 。
MVP 模式
MVP 其实是 MVC 的一种演进版本,它更简单,将 MVC 中的 Controller 改为了 Presenter,View 通过接口与 Presenter 进行交互,降低耦合,方便进行单元测试。
View:负责绘制UI元素、与用户进行交互(Activity、View、Fragment都可以做为View层);
Model:对数据的操作、对网络等的操作,和业务相关的逻辑处理;
Presenter:作为View与Model交互的中间纽带,处理与用户交互的逻辑。可以把Presenter理解为一个中间层的角色,它接受Model层的数据,并且处理之后传递给View层,还需要处理View层的用户交互等操作。
我们看看如下的MVC和MVP的对比图更能直观的理解这两种模式的区别:
最明显的区别就是,MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。
如何在自己的项目中使用 MVP ?
官方给我们写了一些MVP的样例工程,用不同的概念和工具实现同一个Todo项目。
Github地址
- todo-mvp/ - mvp基础架构示例。
- todo-mvp-loaders/ - 基于mvp基础架构项目,获取数据部分使用了Loaders架构。
- todo-databinding/ - 基于mvp基础架构项目,使用了数据绑定组件。
- todo-mvp-clean/ - 基于mvp基础架构项目,使用了clean架构的概念。
- todo-mvp-dagger/ - 基于mvp基础架构项目,使用了dagger2进行依赖注入。
- todo-mvp-contentproviders/ - 基于todo-mvp-loaders架构项目,使用了Content Providers
- todo-mvp-rxjava/ - 基于mvp基础架构项目,全名用RxJava进行并发和数据层处理。
MVP 的好处与问题
当你了解清楚 MVP 模式后,它的好处也就很明显了:
- UI层和逻辑层分离,UI层不在涉及业务逻辑代码,某层的改动不需要到处去修改代码;
- 测试很方便,你可以直接调用Presenter层写测试用式(可以使用Junit框架);
- 最后是可维护性和可扩展性,MVP的各个类职责都非常明确且单一,后期的扩展,维护都会更加容易。
当然,坏处也很明显,首先代码类增加了,一个小功能你可能要为它专门写 Presenter 和 Model 层的实现,以前这些你一口气就加在 View 层了。同时需要对新进项目的人员进行一些 MVP 模式的培训,以便他们不会写出破坏已有模式的代码。
MVVM 模式
MVVM 模式(Model–View–ViewModel模式),和 MVP 模式相比,MVVM 模式用 ViewModel 替换了 Presenter ,其他层基本上与 MVP 模式一致,ViewModel 可以理解成是View的数据模型和Presenter的合体。
MVVM 采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然,这种模式实际上是框架替应用开发者做了一些工作(相当于ViewModel类是由库帮我们生成的),开发者只需要较少的代码就能实现比较复杂的交互。这一步对于我还是比较有吸引力了,可以少写很多模板代码。
官方在 Google I/O 2015 大会上推出来MVVM模式的支持函数库 Data Binding Library。在 Android Studio 2.1 Preview 3 之后,开始支持双向数据绑定,即在 View 层修改输入也会触发 Model 层的改变。
当然,做过 WinPhone 开发的人一定想起来了微软在很多年前就在使用MVVM模式了。
你的朋友是不是也在准备面试呢?你可以把今天的题目分享给好友,或许你可以帮到他。