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. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

  2. fir.im Weekly - 2017 年必须了解的 iOS 开源库

    放假的脚步临近,每个人都在期待一个愉悦的春节假期.最近,@张嘉夫 分享了一篇 Medium 上的文章<33 个 2017 年必须了解的 iOS 开源库>,总结了 2016 年最棒的 iOS ...

  3. DevExpress控件之RepositoryItemComboBox

    RepositoryItemComboBox在嵌入到GridView后,如何获取当前所选的Item? 直接代码: ((RepositoryItemComboBox)gridView.Columns[& ...

  4. Java程序性能优化读书笔记(一):Java性能调优概述

    程序性能的主要表现点: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏 启动时间:程序从运行到可以正常处理业务需要花费多少时间 负载承 ...

  5. Java日期工具类,Java时间工具类,Java时间格式化

    Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>&g ...

  6. 一个想法(续五):IT联盟创业计划:现阶段进度公示、疑问解答及进行中的计划

    前言: 首先今天是元宵节,先祝大伙元宵节快,单纯的快乐! 然后看看开展中的计划: IT联盟创业计划众筹发起:一个想法(续三):一份IT技术联盟创业计划书,开启众筹创业征程 IT联盟创业计划众筹进度:一 ...

  7. iOS Paros 连接在同一WIFI下的网络抓包

    图文详解: 说说网络抓包,几天前的事了,想抓个包看看 某爱网(全名自己脑补)的数据,就上网找了一下抓包,以前经常抓接口,时间长了忘了.那时候也不是用苹果手机抓取的,前几天试着抓了一下,今天不适合敲代码 ...

  8. List<bean>转换Jsonarray知识心得

    使用基本的jdbc连接mysql,获取数据. 创建实体类user: package com.json; public class user { private int id; private Stri ...

  9. 解决Ubuntu不能连接xshell

    首先,判断Ubuntu是否安装了ssh服务: 1.ps -e |grep ssh 如果服务已经启动,则可以同时看到“ssh-agent”和“sshd”,否则表示没有安装服务,或没有开机启动 2.安装s ...

  10. 【CNMP系列】CNMP之路,系统起步。

    简单的来理解,我所说的CNMP,不是CNM+P,而是CentOs+Nginx+MySql+PHP,也可以单纯的理解为LNMP,但是系统是我们自己选的,虽说是Linux的一个分支,但我就喜欢CentOs ...