mvp架构解析
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架构解析的更多相关文章
- 转:Android官方MVP架构示例项目解析
转自: http://www.infoq.com/cn/articles/android-official-mvp-architecture-sample-project-analysis 作者 吕英 ...
- MVP架构在xamarin android中的简单使用
好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪 ...
- MVP之高级MVP架构封装
MVP之高级MVP架构封装 No MVP: 我们一般会这样写: public class MainActivity extends AppCompatActivity { private EditTe ...
- Android框架式编程之MVP架构
MVP(Model-View-Presenter)模式.是将APP的结构分为三层:View - Presenter - Model. View 1. 提供UI交互 2. 在presenter的控制下修 ...
- HDFS 架构解析
本文以 Hadoop 提供的分布式文件系统(HDFS)为例来进一步展开解析分布式存储服务架构设计的要点. 架构目标 任何一种软件框架或服务都是为了解决特定问题而产生的.还记得我们在 <分布式存储 ...
- Magento的基本架构解析
Magento的基本架构解析 magento 是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为 zend框架提供了面向对象的代码库并且有很 ...
- Hadoop工程包架构解析
Hadoop源码解析 1 --- Hadoop工程包架构解析 1 Hadoop中各工程包依赖简述 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算 ...
- MVP架构。。。。
Model-View-Presenter(MVP)概述 MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成 ...
- 转:Android开发中的MVP架构(最后链接资源不错)
Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...
随机推荐
- 访问 Neutron 外部网络 - 每天5分钟玩转 OpenStack(143)
前面我们学习了位于不同 Neutron subnet 的 instance 可以通过 router 通信,今天开始讨论 instance 如何访问外部网络. 这里的外部网络是指的租户网络以外的网络.租 ...
- Android实现先横向横线展现在纵向拉开图片
前段时间产品那边让我做一个动画,要求是先以横线的方式横向展开,在纵向展示图片,最后展示几秒动画在原路返回,随后我在网上查找资料,发现这方面的记录很少,最后自己写了一个 后期还会慢慢改进: 转载请说明出 ...
- C++编程练习(4)----“实现简单的栈的链式存储结构“
如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...
- Swift 面向对象解析(二)
接着上面一篇说的内容: 一 继承: 苹果继承与水果,苹果是水果的子类,则苹果是一种特殊的水果:这就是继承的关系,这个我们学OC的时候相信也都理解了,就不再描述定义了,下面的就叫继承: class ZX ...
- 使用fliter实现ie下css中rgba的效果
直接举例吧background-color: rgba(255,255,255,0.8); 设置背景颜色为白色,不透明度设为80% 在ie下可以用fliter这一属性进行设置: filter:prog ...
- java-6数组
一. 请编写一个程序将一个整数转换为汉字读法字符串.比如"1123"转换为"一千一百二十三".更进一步,能否将数字表示的金额改为"汉字表达?比如将&q ...
- Angular2组件与指令的小实践——实现一个图片轮播组件
如果说模块系统是Angular2的灵魂,那其组件体系就是其躯体,在模块的支持下渲染出所有用户直接看得见的东西,一个项目最表层的东西就是组件呈现的视图.而除了直接看的见的躯体之外,一个完整的" ...
- toupper函数及一些小程序
toupper 原型:extern int toupper(int c); 用法:#include <ctype.h> 功能:将字符c转换为大写英文字母 说明:如果c为小写英文字母,则返回 ...
- 第三章:初识Jquery
一.Jquery的优势 体积小,压缩后只有100KB左右 强大的选择器 出色的DOM封装 可靠的事件处理机制 出色的浏览器兼容性 使用隐式迭代简化编程 丰富的插件支持 二.Jquery语法 三.DOM ...
- Angular.js!(附:聊聊非原生框架项目)
最近,为了项目接触了一个很火的前端框架Angular.js,下面就Angular做一个简介吧(大牛请绕步,只针对没有接触过angular的人). Angular.js是一款精简的前端框架,如果要追溯它 ...