Android设计模式之MVP

最近利用业余时间来深入学习MVP模式,我把自己对MVP模式的理解分享给大家,希望能给你理解MVP模式提供帮助。

MVC

相信大家已经对MVC模式再熟悉不过了。如果你还对MVC模式不熟悉的话,建议把MVC理解透之后再往下看。因为MVP模式可以说是MVC模式在Android开发上演变过来的。

MVC全称为Model-View-Controller,是模型(Model)-视图(View)-控制器(Controller)的缩写。MVC开始存在于桌面程序中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,以便后续程序的维护以及更新。

对于原生的Android项目而言:

  • M(Model): 不要简单地把Model理解成实体类(Entity),Model应该包含2部分功能,一部分是处理业务逻辑,例如一些Helper类;一部分是提供View显示的数据,例如一些Java Entity类。
  • V(View): 负责UI元素绘制,与用户进行交互。一般指的是layout目录下的xml布局文件。
  • C(Controller): 处理与用户交互的逻辑处理。指的是Activity或者Fragment。

为何要使用MVP

我们经常在Activity或者Fragment中执行控件的初始化操作以及处理控件的点击事件,也就是执行findViewById()方法和setOnClickListener()方法。这就导致Activity(Fragment)不是单纯的Controller。随着界面以及其逻辑的复杂度不断提升,Activity(Fragment)的职责不断增加,这会使得Activity(Fragment)变得十分臃肿。想想看,如果Activity或者Fragment代码上千行的话,别说继续增加新功能,连维护都觉得有点恶心。为了给Activity(Fragment)减负,MVP模式就此孕育而生。

MVP

MVC全称为Model-View-Presenter, 是模型(Model)-视图(View)-表示(Presenter)的缩写。Presenter充当Model和View之间交互的桥梁,负责将对应的Model和View组合到一起。

对于原生的Android项目而言:

  • M(Model): 跟MVC模式中是同样的作用
  • V(View): 指的是Activity或者Fragment,负责UI元素的初始化,建议UI元素与Presenter的关联。
  • P(Presenter): 处理与用户交互的逻辑处理。Presenter从model层中接受数据,经过处理之后返回给VIew层。Presenter与View(Activity)之间通过接口(Interface)来交互的。

以antoniolg大神的androidmvp开源项目作为栗子讲解 在项目目录中一共有十个类,我就以login包作为突破点阐述MVP实现思路。

View层中有LoginActivity和LoginView这两个类。LoginActivity是登录界面类;而LoginView是个接口类,根据LoginPresenterImpl类对数据的处理结果进行UI交互。 1)LoginView主要包含更新UI的方法,让LoginPresenterImpl类持有其引用。这样LoginPresenterImpl类就可以通过LoginView来更新UI。具体代码如下:

2)LoginActivity类主要工作是初始化UI和实现更新UI的方法,代码如下:

Presenter层中有LoginPresenterImpl和LoginPresenter这两个类。LoginPresenterImpl是LoginPresenter接口的实现类;LoginPresenter同样也是个接口类。 1)LoginPresenter包含验证登录信息和销毁对象的方法。LoginActivity类可以通过其将数据传递给LoginPresenterImpl类。具体代码如下:

2)LoginPresenterImpl类实现验证登录信息以及销毁对象的方法,但是它内部验证信息还是LoginInteractorImpl类来实现的。具体代码如下:

model层的类分别是:LoginInteractor和LoginInteractorImpl。LoginInteractor也是个接口。LoginInteractorImpl类实现了LoginInteractor中的方法 1)LoginInteractor中的方法是真正处理数据,即验证信息是否符合标准。LoginInteractor会把LoginInteractorImpl处理数据的结果返回给LoginPresenterImpl。

2)LoginInteractorImpl对登录信息进行验证,就是进行判空操作。如果需要请求服务器来判断登录是否成功,那么这里也是进行网络操作。

如果你能把上面的代码拿下,那么你对MVP模式已经理解差不多了。你自己再把剩余的代码看一遍,举一反三,就可以打通了MVP这道脉。

进阶

响应式编程库RxJava已经火的不得了,其好处是很大幅度的降低代码量。MVP和RxJava可以无缝对接,两者算是绝配。

扩展阅读

本文的demo:https://github.com/antoniolg/androidmvp 谷歌官方MVP实例代码: 1、对应分支todo-mvp:https://github.com/googlesamples/android-architecture 2、对应分支todo-mvp-rxjava: https://github.com/googlesamples/android-architecture/tree/todo-mvp-rxjava

作者:猴哥,公众号:极客猴。爱好读书,喜欢钻研技术,梦想成为文艺青年的IT Boy。

- END -

原文发布于微信公众号 - 极客猴(Geek_monkey)

原文发表时间:2016-12-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

Oracle 12c多租户架构及优缺点

Oracle的多租户和MySQL,MSSQL的类似,把之前的一个实例对一个数据库的情形(RAC是多个实例对一个数据库)整合成了一个实例下可以挂多个数据库,并且定...

34420
来自专栏猿湿Xoong

Android 8.0 SystemUI(四):二说顶部 StatusBar

大家好,我是ptt,本篇是 SystemUI 的第四篇,也是 StatusBar 的第二说。

1.7K40
来自专栏IT大咖说

Oracle中最容易被忽略的那些实用特性

内容来源:2017 年 04 月 08 日,ITPUB管理版版主吕海波在“DBGeeK+PG数据库技术沙龙(4月杭州站)”进行《Oracle中最容易被忽略的那些...

15960
来自专栏向治洪

仿360静默安装

之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢?所谓的静默安装,就是不用弹出系统的安装界面,在不影响用户任何操作的情况下不知不觉地将程序装...

46580
来自专栏做全栈攻城狮

安卓开发基础教程-Android多界面应用程序开发

本套教程主要讲解安卓开发的相关知识,从基础到精通。一方面可以巩固自己所得,另一方面可以帮助对安卓开发感兴趣的朋友。

13040
来自专栏yang0range

Activity详解(二)——异常情况下的生命周期分析

最近 无意当中看到一道面试题是关于Activity异常情况下的生命周期分析,感觉自己还有所欠缺,随即在书中寻找完整答案,特记录如下。

23340
来自专栏Android先生

Android App优化之提升你的App启动速度之实例挑战

以之前写的Github App:https://github.com/mingjunli/GithubApp为例.

13130
来自专栏编程微刊

vue.js代码开发最常见的功能集合

按需引入弹框插件import {MessageBox} from 'mint-ui';

14640
来自专栏美团技术团队

Toast与Snackbar的那点事

50760
来自专栏郭霖

Android静默安装实现方案,仿360手机助手秒装和智能安装功能

之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢?所谓的静默安装,就是不用弹出系统的安装界面,在不影响用户任何操作的情况下不知不觉地将程序装...

88290

扫码关注云+社区

领取腾讯云代金券