Android中MVP模式讲解及实践

前两年的时候,我经常逛http://androidweekly.net这个 站,上面就有过很多文章介绍MVP模式,我很感兴趣,于是把这个东西介绍给身边的同事,同事们好像没有多大反应,可能是当时在国内MVP用的范围还比较少吧。后来我换了工作,再后来某一天我发现各类博客纷纷在介绍这个东西,各类群里面也在讨论这个东西。我感觉到MVP被越来越多的人认可了,反倒是自己显得落伍起来。所以,趁着空闲,做一个笔记,以做学习之路的备忘。

什么是MVP模式/h1>

看NBA的都知道MVP(National Basketball Association Most Valuable Player Award ,简称MVP)这个概念,我当时的第一反应也是这个。但是,此MVP非彼MVP.我们今天要讨论的MVP其实同MVC一样,是一种编程模式和思想,也许更准确地讲是一种架构。

MVP和MVC

MVC简介

开发Android的都知道MVC。

  • M对应Model,代表业务数据
  • V对应View,代表视图
  • C对应Controller,代表控制器。

  • M(Model) 数据相关层
  • V(View) 视图层,如Activity上的布局
  • P(Presenter) 纽带层,用来连接Model与View.

MVP开发在Android中的基本流程
1. View层定义View.interface,用来定义View的行为。一般由Activity或者是Fragment来实现这个接口,它定义了View视图的各种变化,如设置Textview,加载对话框,更新进度条等。
2. Model层定义Modle.interface,这个是用来定义数据层发生变化时的通知接口,因为Model不能直接与View交互,所以它与Presenter交互,然后再通过Presenter间接达到与View的交互。
3. Presenter翻译的意思是主持人,也就是主持场合,控制节奏的意思。在这时Presenter就负责具体的业务逻辑,请求数据,把数据送到Model,或者监听Model的数据变化,接受View层的动作,负责通过通知View层的视图变化。

如果跟MVC的架构图对比的话,可以发现它们有相似之处也有不同。

相似之处

模块划分的相似
MVC由Model、View、Controller构成。
MVP由Model、View、Presenter构成。

不同的地方

  1. MVP中Presenter取代了MVC中的Controller
  2. MVC中Model、View、Controller之间相互发生通信,而MVP中Model与Presenter相互通信,View与Presenter相互通信,而Model与View之间没有通信。

Android中MVP的好处/h2>

就Android层面上来讲MVC架构虽然好,但不是最好,情况前面有讲过。用一句话概括就是“模块界限很模糊”。而MVP的出现实际上就是将MVC进行升级,对应Android开发中就是帮助Activity解压。
MVC中Activity同时充当了V和C的角色,这就属于界限划分不清楚。而MVP则划分的很清楚,Activity只充当V的角色,业务逻辑控制交给了Presenter.

个人对MVP模式的理解

这一段是我自己的看法,也许不正确。
我个人觉得MVP没有什么很神秘的,因为Android SDK上开发,本来就差不多是MVC的角色。Activity基本上Android开发中最重要的一环。
我以前在团队工作的时候,团队分工是每人负责相应的Activity,在这里Activity是最小的开发单元。再后来,某些Activity变得越来越重要,越来越复杂,代码也越来越多,这样会造成团队某个人的开发任务重,而其他的团队成员也帮不上忙。而MVP的出现可以将Activity再细分,划为View和Presenter两个部分,所以Activity不再是最小的开发单元,如果可以完全可以这样分配任务,一个开发人员负责View部分,另一个开发人员负责Presenter部分。
况且因为MVP的划分,所以各个部分其实相对独立,V的变动会对P的部分造成较少的影响,而M对V或者说V对M几乎是透明的。
因为Presenter的存在,View和Model就可以很轻松,顶多Presenter累一点。
还有一个特点是MVP模式很适合测试,单独测试VIEW成了一种可能。我们可以模拟View和Model的数据来测试Presenter的逻辑。

MVP实战

在现在的公司项目中,我已经用上了MVP模式开发。但是在这里,我不想照搬代码。主要是因为怕复杂的代码或者其它的知识点干扰MVP本身的脉络。所以,我用一个简单的DEMO来讲解,大家一看就明白。

场景需求

假设现在需要做一款APP,就是显示天气,界面很简单,一个TextView显示天气信息,一个Button用来请求实时天气。
如下图所示

代码开发

因为选定MVP模式,所以第一步就是包的组织。

Model层的接口定义及实现

Model层是数据层,用来存储数据并且提供数据。在这里为了便于演示,数据被简化为了String类型。
接口定义如下:

它的实现文件如下:

Presenter代码及实现

Presenter是个大忙人,因为要同时对View和Model对接,所以内部必须持有它们的接口引用。
所以有如下:

Presenter与View的通信
View—–>Presenter

从视图界面出发,用户要请求数据,而Presenter是具体实现者,所以Presenter要提供方法代View的实现者调用,并且View的实现中必须要有Presenter的引用。
所以MainActivity.java中要有WetherPresenter的引用。

而Presenter也要开发API供View调用。
所以Presenter要有requestWetherInfo()方法:

presenter—–>View

presenter操作View,是通过View.interface,也就是View层定义的接口。
所以很容易得到下面的代码:

因为Presenter持有View的引用,所以在这里要将View.interface注入到Presenter当中。

Presenter与Model的通信

Presenter与Model的通信也是双方的。

Presenter—->Model

presenter获取到了数据,可以交给Model处理

Model—–>Presenter

Model处理完数据后它也能对Presenter提供数据。Presenter可以通过Model对象获取本地数据。

WetherPresenter.java

Presenter代码实现

前面已经讲了Presenter与Model,Presenter与View之间的通信,现在就可以编写代码将它们粘合起来。
Presenter本身需要向服务器获取代码,所以还要编写它的相应方法:

到此,完整的Presenter代码如下:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年9月15日
下一篇 2016年9月15日

相关推荐