http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html

在开发Android应用时,相信很多同学遇到和我一样的情况,虽然项目刚开始构架时自认为MVC层级分的特别明确,但最终往往是一个Activity有好几百行代码,而且逻辑和UI显示完全混杂在一起,导致后续项目的维护成本巨大。一个偶然的机会看到有种MVP模式(Mode-View-Presenter)可以比MVC更好的解耦和,然后好奇的研究了下这个模式并尝试在现在项目中进行推广。下面就把自己目前学习到知识总结出来。

MVP模式将分为两篇博客进行总结:

(一)Android开发MVP模式解析

(二)Android开发MVP模式实践

一、MVP简介

我理解的MVP是由MVC优化衍生出来的一种模式,MVP将MVC中的Controller层进行了优化而生成了Presenter。Presenter单词翻译为“提出者;任命者;主持人”,Presenter层和MVC的Controller一样,负责核心逻辑,但不一样的是Presenter通过接口协议进行数据传递,并阻断了View和Model的直接联系,从而使View和Model更加专注于自身业务逻辑。

二、MVP结构

View

View通常来说就是有Activity、Fragment实现的,View会包含一个或多个Presenter的引用来满足视图的业务逻辑。View和Presenter的交互是双向的,即View层可以调用Presenter的逻辑方法,Presenter也可以控制View的显示。

Presenter

Presenter作为Model和View的桥梁,负责从Model拿到数据进行处理并返回给View。但Presenter和其他两层的沟通是通过接口协议进行的,所以每个Presenter中通常会包涵一个或多个接口协议。

Model

和MVC一样,作为数据仓库只负责对APP数据进行处理。

Android开发MVP模式实践中的示例将APP分为以下四层。

    • Entities:APP中的业务类。
    • Use Cases:负责从将Entities中的数据进行处理和包装。
    • Presenters:从Use Cases获取处理好的数据,然后根据需求逻辑为UI提供合适的数据。
    • UI:从Presenters获取处理好的最终数据,和用户进行直接交互。
这四层设计的原则是代码调用只能从外圆向内圆扩展,内圆不能干预也不需关心外圆的功能逻辑,这符合MVP的思想,Use Cases和Presenters将Entities和UI间隔分离,从而使Entities和UI只需关心自身逻辑,数据处理完全交给其他两层。
这里,有些同学可能会有疑问,说好的Presenters为什么会有Use Cases出来搅局?其实这也是我选择这个工程当做示例的目的,看了好多MVP文章,都在讲Presenter如何通过接口协议和其他两层进行交互,但大都忽略了Presenter层自身的构架,因为仅仅套用MVP模式,虽然在一定程度上降低View的耦合度,但因为Presenter既要处理数据,又要结合需求控制UI交互,所以很可能出现Presenter逻辑的冗余。后文的示例工程在Presenter和Model之间包装了Use Cases,将数据逻辑处理交给UseCases从而让Presenter更专心于UI交互。

三、MVP VS MVC

在把原本MVC模式的代码修改为MVP模式后,总结这两个模式在实际使用过程中的不同点基本上总结为两点:

    • 各个层之间通过接口协议进行沟通;
    • View和Model不再进行直接交互;

四、总结

MVP将会为你的代码带来如下好处:

  • View和Model之间的耦合度降低,使其更关注自身业务逻辑;
  • 便于单元测试;
  • 代码复用率提高;
  • 代码框架更适用于快速迭代开发;
参考资料:

Android开发MVP模式解析的更多相关文章

  1. Android开发 MVP模式的规范记录(个人总结)

    前言 首先,这篇文章不在讲解什么是mvp模式,如果需要请自行搜索mvp模式文章了解.这个文章里我只记录mvp模式的创建和mvp各自层的界限.另外这个博客属于个人使用mvp模式后一些经验总结与记录.并不 ...

  2. ym——Android开发MVP模式(攻克了View和Model的耦合)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 什么是MVP呢?它又和我们经常听到的MVC有什么关系了以及差别呢? MVP 是从经典的 ...

  3. android开发-mvp模式理解

    看之前,先忘掉所有,一步步看就行了. 最后会有一个原型demo,当然是转的了.看完文章,再看demo,然后再回头看文章就很好理解了,最好自己写一遍. 1.mvp开发模式可以理解为页面接口编程,每一层的 ...

  4. android的MVP模式

    MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型. ...

  5. 说说Android的MVP模式

    http://toughcoder.NET/blog/2015/11/29/understanding-Android-mvp-pattern/ 安卓应用开发是一个看似容易,实则很难的一门苦活儿.上手 ...

  6. android中MVP模式(一) - 清风明月的专栏 - CSDN博客

    presenter 主持人.主导器 ====== 1. 明确需求,界面如下:可存,可根据id读取数据. 包结构图 2. 建立bean public class UserBean { private S ...

  7. Android中MVP模式与MVC模式比較(含演示样例)

    原文链接 http://sparkyuan.me/ 转载请注明出处 MVP 介绍 MVP模式(Model-View-Presenter)是MVC模式的一个衍生. 主要目的是为了解耦,使项目易于维护. ...

  8. (未完成)【Android】MVP模式初见(一)

    最近在阅读郭霖大神的公众号时,分类中架构引起了我的注意. 虽然是个人开发(水平很菜的那种),但最终都要向企业正式项目开发靠近.因此接下来一段时间,主要学习一下MVP架构.Retrofit以及RxJav ...

  9. Android -- 初探MVP模式

    1,相信大家对mvp模式都很熟悉了,M-Model-模型.V-View-视图.C-Controller-控制器.MVP作为MVC的版本演化,与MVC的意义类似:M-Model-模型.V-View-视图 ...

随机推荐

  1. strtok

    1. Int main(void) { char *tmp = NULL; Char *remotebuf=”0\r\n”; tmp = strtok(remotebuf, DELIM);      ...

  2. 支持IE6以上阴影效果纯CSS

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. curl检查远程文件是否存在

    size_t processdata(void *buffer, size_t size, size_t nmemb, void *user_p) { //写一个空的写函数 return nmemb; ...

  4. 关于 Lua 内存泄漏的检测

    前一阵开始和同事一起优化内存,首先是优化 Lua 内存,因为发现每次战斗完后 Lua 内存非常大,从 3M 左右在经过了10次左右的战斗后,会暴增到近 100M,很明显是有内存泄漏.      然后我 ...

  5. linux 内存管理——内核的shmall 和shmmax 参数

    内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个设置的比SGA_MAX_SIZE大比较好. SHMMIN= 最小的内存seg ...

  6. HW4.33

    public class Solution { public static void main(String[] args) { int sum; for(int i = 6; i < 1000 ...

  7. Zabbix lld发现磁盘监控

    一.软件版本 操作系统:CentOS-6.5-x86_64 zabbix版本:3.0.3 二.脚本编写: 1.python版本: #!/usr/bin/env python import json i ...

  8. flex dispatchEvent 实例

    flashbuilder sdk:3.6:jdk:1.7,:tomcat:7:myeclipse:10.0 Flex dispatchEvent实例下载:点击打开链接 Flex dispatchEve ...

  9. DoctorNote医生处方笔记开发记录

    1.开发背景 一个开诊所的中医朋友,希望我能给他开发一个记录病人姓名和处方的Android手机app,以便查询病人每次就诊信息,比如上一次的处方,以前他要找个病人上一次的就诊处方,几乎要翻遍一叠厚厚的 ...

  10. macos ssh host配置及免密登陆

    windows下面有xshell 这样的可视化ssh管理工具 macos 下面使用终端做下简单配置,也非常方便,具体过程如下 生成秘钥 cd ~/.sshssh-keygen -t rsa 生成了私钥 ...