认识Android中的MVP设计模式

前言

Android中的MVP设计模式如今已然不是什么新鲜的东西了,目前我们在做的项目中也已经广泛在使用。当我们的项目越来越庞大,越来越复杂,参与的研发人员越来越多的时候,你会发现MVP设计模式的优势越来越明显。

MVC vs MVP

开始前还是简单的聊聊MVP模式,MVP模式是MVC模式在Android上的一种变体,要介绍MVP就得先介绍MVC。在MVC模式中,Activity应该是属于View这一层。而实质上,它既承担了View,同时也包含一些Controller的东西在里面。这对于开发与维护来说不太友好,耦合度大高了。把Activity的View和Controller抽离出来就变成了View和Presenter,这就是MVP模式。

MVP模式(Model-View-Presenter)可以说是MVC模式(Model-View-Controller)在Android开发上的一种变种、进化模式。后者大家可能比较熟悉,就算不熟悉也可能或多或少地在自己的项目中用到过。要介绍MVP模式,就不得不先说说MVC模式。

MVC

MVC模式下,系统框架的类库被划分为3种:模型(Model)、视图(View)、控制器(Controller)。模型对象负责建立数据结构和相应的行为操作处理。视图对象负责在屏幕上渲染出相应的图形信息展示给用户看。控制器对象负责截获用户的按键和屏幕触摸等事件,协调Model对象和View对象。

用户与视图交互,视图接收并反馈用户的动作;视图把用户的请求传给相应的控制器,由控制器决定调用哪个模型,然后由模型调用相应的业务逻辑对用户请求进行加工处理,如果需要返回数据,模型会把相应的数据返回给控制器,由控制器调用相应的视图,最终由视图格式化和渲染返回的数据,对于返回的数据完全可以增加用户体验效果展现给用户。

一个模型可以有多个视图,一个视图可以有多个控制器,一个控制器也可以有多个模型。

MVP

MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。

模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等;

视图(View):负责界面数据的展示,与用户进行交互;

主持人(Presenter):相当于协调者,是模型与视图之间的桥梁,将模型与视图分离开来。

MVC vs MVP

MVP模式的优势

1.分离了视图逻辑和业务逻辑,降低了耦合

2.Activity只处理生命周期的任务,代码变得更加简洁

3.视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性

4.Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试

5.把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存泄露和OOM

MVP的一个简单案例

想写这个案例费了一些脑筋,从网上看了一圈,写的最多的就是登录功能。那我也就照着写了一遍,在这跟大家简单的理一遍思路,重在学习。

界面展示

要实现的功能可能很简单,如下图,主要就是登录和重置功能。

主界面

项目的MVP架构展示

项目架构展示

bean目录

这个应该很好理解,就是User对象的实体Bean。这个我就不细讲了,大家应该都知道。

model目录

IUserModel :定义了处理Login业务逻辑的接口。三个参数:用户名、密码、回调的一个接口。

IUserModel OnLoginListener

IUserImp:Model层的具体实现类

IUserImp

View层:IUserView接口中,我们抽象出来了很多方法。

IUserView

接下来我们来想想Presenter层怎么设计,思考在当前的主界面会有几个触发的事件,会发现有两个login和reset。所以在Presenter中处理的方法就有两个。

UserLoginPresenter

最后要介绍的就是实现我们View层抽象接口的重量级人物了:Activity

MainActivity

至此本文只是对MVP设计模式做了一个简单的介绍,具体神奇在何处,需要各位自己去挖掘了。

案例项目的源码在我的Github上:MVPSchema


大眼杰克  jxiaolee@aliyun.com

To 每一个认真阅读我博客的朋友们:只要心中有希望存在,就有幸福存在。

更多相关文章

  1. APPS大乱斗:4大Android文件浏览器横评(一)
  2. [翻译] Android是怎样绘制视图的
  3. [手机取证] 绕过屏幕锁定启用调试模式-For Android(安卓)4.4.2
  4. Flutter布局中嵌入Android原生组件 - 全景图组件封装
  5. Android源码分析:HeaderViewListAdapter
  6. Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
  7. android 上下文菜单Context Menu--折腾一天的东东
  8. android的ImageView中XML属性src和background的区别
  9. android中轮播图的实现

随机推荐

  1. Android:Animation
  2. 转:LinearLayout布局
  3. Android(安卓)studio :Please configure
  4. [Android] 基于 Linux 命令行构建 Androi
  5. Android(安卓)如何使用GPU硬件加速
  6. android media库中external的读取
  7. android 所有布局属性和UI控件
  8. android ListView没有数据时信息显示
  9. 【Android开发学习01】与Android实体设备
  10. Android中RelativeLayout各个属性的含义