MVP现在已经是目前最火的架构,很多的框架都是以MVP为基础,甚至于Google自己都出一个MVP的开源架构。https://github.com/googlesamples/android-architecture,里面有好几个项目,我们先谈下todo-mvp这个最基础的MVP架构。

说到MVP,我们不得不谈到最最经典的MVC架构。什么是MVC,概括来说就是数据层,控制层以及显示层的分离。虽然我们可以把所有的代码都写在一个类里,但是作为了一个优秀的程序员你我想一定不会这样做,所以我们想到了解耦,解耦也是扩展性,可测性以及可维护性的基础。那么最简单也最通用的解耦就是分层,根据调用关系从上而下或是根据业务的特性,从业务功能分层实现。如jsp+severlet+db的mvc结构就是按照从上到下划分的。Jsp是用于显示,serverlet是业务控制,db是数据层。MVC的层级结构如下:

Controller响应用户的操作事件,以及对请求事件的转发和处理。在事件的处理和转发过程中会操作Model,对Model进行必要的增,删,改,查等一系列单一或是组合处理。而Model是在经过Controller的操作后,让View根据Model刷新自己的状态,从而呈现给用户,但是Model是不能直接通知View的,一定要通过Controller 。这个是一个完整的MVC流程。简易交互如下:

而在android里对应的mvc结构是:V可以理解为控件,C是activity,M是数据。 如果M的变化要通知到V,只能走: M->C->V,这条路径也就是上图的体现,这比较常用的,但这种交互有个缺点,就是会导致C很复杂:C作为Activity要进行业务逻辑处理,要控制V的现实逻辑,同时还要做好告知V数据变化的任务。这样会导致一个角色具有多种功能,这在架构中是很不好的一种表现方式,会使得这个模块代码行数多,逻辑复杂,不可测,扩展性差等问题。

为了使得C的功能尽量单一化,所以我们就引入了MVP模式(个人看法),这个P是什么,可以把P看成是一个三角菱镜,放在了上面的交互中间,所以MVP的交互可以看成:

图中红色部分就为P.蓝色为原来MVC的调用路线,黑色为MVP的调用路线。通过P的引入,会最大化的释放C的功能,使得C功能单一化,把业务逻辑处理和告知V数据变化等功能分离给P来处理。这样C的功能更多的是初始化P,V,M三则之间的关系。

我们来分析下todo-mvp(我们只是从架构层次去分析,不是从业务或是代码逻辑分析):下面是todo-mvp一个功能addedittask的UML图(用的是Gliffy画的,不是很标准),其他功能类似

每个功能都包含一个Activity,一个或是多个fragment,以及对应的Presenter在这个MVP模式中,Activity已经不是MVP的一部分了,它更多的作用是全局控制,初始化这个三者之间的关系。如何初始化的呢?是通过

new AddEditTaskPresenter(
        taskId,
   Injection.provideTasksRepository(getApplicationContext()),
        addEditTaskFragment);

这行代码,新建一个TaskPresenter,同时传入一个TaskRepository和Fragment,进行关联的。

所有界面显示的都放在了Fragment里,Frament实现了TaskContract里的View接口,View接口定义了一些显示操作,具体是什么时候显示确实由Presenter来决定,因为Presenter实现所有的业务逻辑。Model层为了可扩展性,也通过接口的形式来实现。

每个功能都包含一个Activity,一个或是多个fragment,以及对应的Presenter在这个MVP模式中,Activity已经不是MVP的一部分了,它更多的作用是全局控制,初始化这个三者之间的关系。如何初始化的呢?是通过

new AddEditTaskPresenter(
taskId,
Injection.provideTasksRepository(getApplicationContext()),
addEditTaskFragment);

这行代码,新建一个TaskPresenter,同时传入一个TaskRepository和Fragment,进行关联的。

所有界面显示的都放在了Fragment里,Frament实现了TaskContract里的View接口,View接口定义了一些显示操作,具体是什么时候显示确实由Presenter来决定,因为Presenter实现所有的业务逻辑。Model层为了可扩展性,也通过接口的形式来实现。

这就是整个MVP的框架,这样的一个好处是:极大的简化了Activity的功能,同时引入了Presenter,把业务逻辑和Model的入口都放在Presenter。有人担心这样会导致Presenter过于庞大,对于这点我说下我的观点:Presenter不是一个类,完全可以根据业务需要引入多个Presenter。

mvp架构解析的更多相关文章

  1. 转:Android官方MVP架构示例项目解析

    转自: http://www.infoq.com/cn/articles/android-official-mvp-architecture-sample-project-analysis 作者 吕英 ...

  2. MVP架构在xamarin android中的简单使用

    好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪 ...

  3. MVP之高级MVP架构封装

    MVP之高级MVP架构封装 No MVP: 我们一般会这样写: public class MainActivity extends AppCompatActivity { private EditTe ...

  4. Android框架式编程之MVP架构

    MVP(Model-View-Presenter)模式.是将APP的结构分为三层:View - Presenter - Model. View 1. 提供UI交互 2. 在presenter的控制下修 ...

  5. HDFS 架构解析

    本文以 Hadoop 提供的分布式文件系统(HDFS)为例来进一步展开解析分布式存储服务架构设计的要点. 架构目标 任何一种软件框架或服务都是为了解决特定问题而产生的.还记得我们在 <分布式存储 ...

  6. Magento的基本架构解析

    Magento的基本架构解析 magento 是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为 zend框架提供了面向对象的代码库并且有很 ...

  7. Hadoop工程包架构解析

    Hadoop源码解析 1 --- Hadoop工程包架构解析 1 Hadoop中各工程包依赖简述    Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算 ...

  8. MVP架构。。。。

    Model-View-Presenter(MVP)概述    MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成 ...

  9. 转:Android开发中的MVP架构(最后链接资源不错)

    Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...

随机推荐

  1. 实现过程全纪录——自己写一个“微信朋友圈”(包括移动端与PC端)

    一.朋友圈的基本单元--动态 首先定义一个自定义控件用来显示每条动态. 二.运行效果 三.核心解读 PushedMessage 有个PushIndex属性,表示发送消息的index,从0开始递增.每个 ...

  2. 《JAVASCRIPT高级程序设计》错误处理与调试

    一.错误处理 错误处理在程序设计中的重要性是毋庸置疑的,任何有影响力的web应用程序都需要一套完善的错误处理机制.良好的错误机制可以让用户得到提醒,知道发生了什么事. 1.try-catch语句 tr ...

  3. WAS缓存导致的修改文件不生效问题【转】

    WAS缓存导致的修改文件不生效问题: 解决方法: 一. 修改web.xml文件,需要修改以下三个目录下的文件: 1. /opt/IBM/WebSphere/AppServer/profiles/Dmg ...

  4. 简单三层分页aspnetpager控件(欢迎指点)

    首先添加引用AspNetpager.dll(将.dll文件放在bin中进行引用) 接着添加<%@ Register Assembly="AspNetPager" Namesp ...

  5. 解决 Windows instance 时间不同步问题 - 每天5分钟玩转 OpenStack(153)

    这是 OpenStack 实施经验分享系列的第 3 篇. 问题描述 通过上一节部署出来的 Windows instance 有时候会发现操作系统时间总是慢 8 个小时,即使手工调整好时间和时区,下次 ...

  6. java测试之文件操作

    package filestream; import java.io.File; public class FileTester { public static void main(String [] ...

  7. git文件夹下项目更改ip地址小结

    在我们开发的过程中,经常切换项目IP地址是很正常的,之前弄过一次,没有记住,现在简单的总结下: 找到要切换IP地址的项目,点击鼠标右键,弹出下图: 打开该项目的路径后,双击打开该项目,具体参考自己项目 ...

  8. node.js 学习随笔

    一,cnmp的操作: 1,cnmp info jquery查询jquery的版本: 2,cnmp install jquery@1.11.1:安装: 3,cnmp list查询所有下载的内容: 4,c ...

  9. 【转载】简析TCP的三次握手与四次分手

    最近在补习HTTP协议相关知识点,看到这篇讲得不错,所以转载收藏一下,同时也分享给大家.原文地址:http://www.jellythink.com/archives/705,版权归原作者所有. TC ...

  10. php代码审计--sql注入

    sql注入是web安全中最常见,也是平常中危害最大的漏洞. 最近在学习代码审计,拿自己审核的一段代码做个笔记. 1.sql语句拼接可能引起sql注入 很多偷懒的程序员对于没有过滤的参数,直接将其拼接到 ...