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. POJ1144(割点)

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12551   Accepted: 5771 Descript ...

  2. EF6的多线程与分库架构设计实现

    1.项目背景 这里简单介绍一下项目需求背景,之前公司的项目基于EF++Repository+UnitOfWork的框架设计的,其中涉及到的技术有RabbitMq消息队列,Autofac依赖注入等常用的 ...

  3. 原生JS 购物车及购物页面的cookie使用

    ////////////////////////////////////购物页面 <!DOCTYPE html><html lang="en"><he ...

  4. 读书笔记 effective c++ Item 5 了解c++默认生成并调用的函数

    1 编译器会默认生成哪些函数  什么时候空类不再是一个空类?答案是用c++处理的空类.如果你自己不声明,编译器会为你声明它们自己版本的拷贝构造函数,拷贝赋值运算符和析构函数,如果你一个构造函数都没有声 ...

  5. AR_Demon(使用vuforia平台提供的钥匙跟后台,实现相机拍图片读取模型以及视频的功能)

    1.https://developer.vuforia.com注册账号. 2.分别添加License Manager(连接钥匙),Target Manager(图片后台下载). 3.下载vuforia ...

  6. nagios安装及监控Linux主机

    服务端的操作:##################################安装lamp环境及依赖包##########################   24  rpm -ivh gd-de ...

  7. matlab图像显示程序模板

    在这个程序中:优秀的模板值得学习,变量的定义字典值得学习 .^ .* ./的使用:        图形的显示及标注 % 脚本文件: 功率计算 % 文件名:cac_power.m % 目标:随着电阻值的 ...

  8. 使用光盘iso实现Linux操作系统的自动安装部署

    前边写了一篇使用 PXE 的方式批量安装操作系统,不是任何时候任何地方都有环境来通过 PXE 方式来进行安装.如果此时需要通过光盘安装,默认的情况下是通过交互式方式进行安装,其实也可以通过 kicks ...

  9. Oracle索引语句整理

    转载:http://www.cnblogs.com/djcsch2001/articles/1823459.html 索引,索引的建立.修改.删除 索引索引是关系数据库中用于存放每一条记录的一种对象, ...

  10. 如何用docker安装laravel开发环境

    如何用docker安装laravel开发环境 看laravel框架的官方文档安装部分时,发现需要安装特别多软件,估计还有许多复杂的配置,官方推荐使用Laravel Homestead虚拟机进行安装,但 ...