android基础:浅析mvc与mvp

为什么要使用框架

设计框架的目的:

  • 提高开发效率,尤其是协同工作
  • 业务逻辑的切分,渐进式开发,提高业务的重用性,灵活性
  • 测试以及问题的定位
  • 日常的更新与维护

MVC

经典的框架,view层,model层,Controller层.
用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

在android中的实践呢?

  • M层:适合的业务逻辑。数据库存取,网络操作,复杂算法,耗时操作
  • V层:显示数据
  • Contro层:在很多情况下activity会掺和很多Controller的事情,activity负责人机交互界面。

举例:
Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等)。

优点:

(1)耦合性低。所谓耦合性就是模块代码之间的关联程度。利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离,这样就达到了解耦的目的,所以耦合性低,减少模块代码之间的相互影响。便于进行单元开发,单元测试
(2)可扩展性好。由于耦合性低,添加需求,扩展代码就可以减少修改之前的代码,降低bug的出现率。
(3)模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。

缺点:

Activity中有很多关于视图UI的显示代码,因此View视图和Activity控制器并不是完全分离的,当activity类业务过多的时候,会变得难以管理和维护。
尤其是当ui的状态数据,跟持久化的数据混杂在一起,变得极为混乱。

MVP

为了解决view层代码过多,引入了这套设计框架。
MVP从更早的MVC框架演变过来,与MVC有一定的相似性:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
如下图

MVP框架由3部分组成:View负责显示,Presenter负责逻辑处理,Model提供数据。在MVP模式里通常包含3个要素(加上View interface是4个):

  • View:负责呈现ui,与用户进行交互,如activity fragment
  • Model: 负责存储,检索,操作数据
  • Presenter:作为view跟model的桥梁,处理交互与数据逻辑。
  • View Interface:Presenter中持有的view层接口,负责给view返回消息。降低耦合,方便单元测试

优点

1 模型与视图完全分离,我们可以修改视图而不影响模型;
2 可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部;
3 我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁;
4 如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。

两者的区别

(最主要区别)View与Model并不直接交互,而是通过与Presenter交互来与Model间接交互。而在MVC中View可以与Model直接交互
通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。而Controller是基于行为的,并且可以被多个View共享,Controller可以负责决定显示哪个View
Presenter与View的交互是通过接口来进行的,更有利于添加单元测试。

附赠MVVM知识

MVVM可以算是MVP的升级版,其中的VM是ViewModel的缩写,ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModel和View之间的交互通过Data Binding完成,而Data Binding可以实现双向的交互,这就使得视图和控制层之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力。

MVC -> MVP -> MVVM 这几个软件设计模式是一步步演化发展的,MVVM 是从 MVP 的进一步发展与规范,MVP 隔离了MVC中的 M 与 V 的直接联系后,靠 Presenter 来中转,所以使用 MVP 时 P 是直接调用 View 的接口来实现对视图的操作的,这个 View 接口的东西一般来说是 showData、showLoading等等。M 与 V已经隔离了,方便测试了,但代码还不够优雅简洁,所以 MVVM 就弥补了这些缺陷。在 MVVM 中就出现的 Data Binding 这个概念,意思就是 View 接口的 showData 这些实现方法可以不写了,通过 Binding 来实现。

google官方已经推出了Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件
Data Binding库不仅灵活而且广泛兼容- 它是一个support库,因此你可以在所有的Android平台最低能到Android 2.1(API等级7+)上使用它。

三者的异同


三者的差异在于如何粘合View和Model,实现用户的交互操作以及变更通知

参考文献

Android App的设计架构:MVC,MVP,MVVM与架构经验谈

Data Binding 用户指南(Android)

Android DataBinding:再见Presenter,你好ViewModel!