适用android的MVP:怎样组织展示层
原文
MVP for Android:How to organize presentation layer
http://antonioleiva.com/mvp-android/
译文
MVP(Model-View-Presenter)模式是著名的MVC(Model-View-Controller)模式的衍生.这段时间,MVP在Android应用开发上得到重视.越来越多的人讨论它,可是可靠的和结构化的信息仍然非常少.这就是为什么我想利用这个博客鼓舞这样的讨论,而且把我们所知
以最好的方式应用到项目中.
什么是MVP?
MVP模式同意展示层与逻辑分离,这样界面怎样工作与我们怎样在屏幕上展现它分开了.理想的情况下,MVP模式使得同样的逻辑能够包括全然不同的可替换的视图.
须要澄清的第一件事是,MVP不是一个架构模式.它仅仅负责展示层.无论如何,在你的架构中使用它都比全然不使用它好.
为什么使用MVP?
在andrid中,activities使交互和数据訪问机制紧密耦合,这引起了一个问题.我们能找到极端样例比方CursorAdapter,混合了adapters和cursors,adapters是视图的一部分,而cursors应该归到数据訪问层的深处.
要使一个应用能够方便的扩展和维护,我们须要非常好的分层.假设明天不再从数据库取同样的数据,而是从web service取,我们该怎么办?
我们须要重做整个view.
MVP使views 独立于我们的数据源.我们把应用至少分成三个不同的层,这样使得測试更加独立.使用MVP使我们可以把大部分逻辑从activities拿走,这样我们不使用instrumentation就能測试.
在Android中怎样实现MVP?
怎样实现MVP,在一開始答案就变得非常分散.有非常多MVP的变种,每一种都依据他们的须要调整了这个模式的想法和更舒服的实现方案.模式的变化主要基于我们托付给presenter的职责数量.
是view负责显示和关闭进度条,还是应该presenter来做?在Action Bar中,谁来决定展示哪个动作?这是艰难讨论的開始.我将展示我是怎样工作的,但我希望这篇文章成为一个地方,讨论怎样应用MVP的严格指导方针,由于眼下为止没有标准的实现方式.
The presenter
Presenter是负责扮演view和model的中间人.它从model获取数据,并将返回的数据适配view.但不像严格的mvc,当你和view交互的时候,它也决定将发生什么.
The View
View经常被一个activity 或者 Fragment实现(这取决于app的结构),view包括一个presenter的引用.理想情况下,Presenter将由类似Dagger的注解器提供.注解器负责创建Presenter对象,但实际上你不这样子做.view唯一做的事,就是每当有交互动作的时候调用presenter的方法(比方点击button).
The model
在一个分层架构良好的应用中,这样的Model仅仅是一扇通往领域层或者业务逻辑的大门.假设我们使用Uncle Bob clean architecture,Model非常可能成为实现了一个用例的交互器.可是这是还有一个主题,我会在未来的文章中讨论.如今,全然能够把它看成view上展现的数据的提供者.
一个样例
由于这个解释有点长了,我写了个放在github上的mvp的样例.由登陆界面组组成,登陆界面能够验证数据,而且同意进入带有从model返回的列表的首页.这篇文章没有解释不论什么代码,由于那非常easy,假设你认为难以理解,我会在写一篇文章详解.
MVP demo地址:https://github.com/antoniolg/androidmvp
结论
把逻辑和界面分离并不easy,可是MVP模式能够防止我们的activities终于退化成很耦合的类,包括数百或数千行代码.在大型应用中组织好我们的代码是至关重要的.否则,就不可能维护和扩展.
适用android的MVP:怎样组织展示层的更多相关文章
- 说说Android的MVP模式
http://toughcoder.NET/blog/2015/11/29/understanding-Android-mvp-pattern/ 安卓应用开发是一个看似容易,实则很难的一门苦活儿.上手 ...
- Android 组件化/模块化之路——在展示层搭建MVP结构
Android 组件化/模块化之路——在展示层搭建MVP结构 什么是MVP Model–View–Presenter (MVP) 源于 Model–View–Controller (MVC) 的结构设 ...
- Android MVC MVP
从.NET的宠物商店到Android MVC MVP 1 一些闲话 记得刚进公司的时候,我们除了做常规的Training Project外,每天还要上课,接受各种技术培训和公司业务介绍.当时第一次 ...
- Android源码剖析之Framework层升级版(窗口、系统启动)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...
- Android开发MVP模式解析
http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...
- Android开发 MVP模式的规范记录(个人总结)
前言 首先,这篇文章不在讲解什么是mvp模式,如果需要请自行搜索mvp模式文章了解.这个文章里我只记录mvp模式的创建和mvp各自层的界限.另外这个博客属于个人使用mvp模式后一些经验总结与记录.并不 ...
- android的MVP模式
MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型. ...
- MVC5 网站开发之五 展示层架构
展示层由Ninesky.Web项目实现,负责网站内容的显示,项目包含Member和Control两个区域. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项 ...
- Android实现图表绘制和展示
本文演示在Android平台中绘制和展示图表示例,本示例是基于RChart 2实现的. 在一个系统中经常要用到图表统计数据,在WEB开发中图表绘制是一件简单的事情,因为有比较多的开源方案.但在Andr ...
随机推荐
- UVA 12508 - Triangles in the Grid(计数问题)
12508 - Triangles in the Grid 题目链接 题意:给定一个n∗m格子的矩阵,然后给定A,B.问能找到几个面积在A到B之间的三角形. 思路:枚举每一个子矩阵,然后求[0,A]的 ...
- LintCode-最大子数组差
给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 您在真实的面试中是否遇到过这个题? Yes 例子 给出数组[1 ...
- maven项目运行没问题,但是项目名上有一把×
原因有以下:你先要自己进行检查,看是出现的什么错误 有红叉,并不代表编译和运行就出错.到Windows—Show view—Problems下看看到底报了什么错.像一些validation出错,项目虽 ...
- vim基础学习之搜索功能
当我们使用vim看源码的时候,我们可能会碰到一个方法或者变量,我们想要知道这个变量在其他地方的使用情况.这时候我们经常的做法就是退出当前的文件,或者是重新切换一个终端,然后使用grep或者find等s ...
- gvim window7 下提示乱码
今天在win7下安装gvim的时候,发现所有的提示信息都是乱码的,在网上找到了如下的解决方案.在此记录下,方便以后查阅. 以下内容转载自http://blog.csdn.net/rehung/arch ...
- thinkphp5多文件上传如何实现
thinkphp5多文件上传如何实现 一.总结 一句话总结:官方文档,测试一下,一定要测试,打印中间变量,就知道每句话是什么意思,一定要测试一下.又简单有快. 测试一下,你就能确定中间变量和你的是不是 ...
- jquery插件库http://www.jq22.com/
http://www.jq22.com/ http://www.jq22.com/jquery/%E5%8A%A0%E8%BD%BD http://www.jq22.com/jquery/%E5%BC ...
- Typedef和#define之间的区别
Typedef和define都可以用来给对象取一个别名,但是两者却有着很大不同. 1. 首先,二者执行时间不同 关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能 ...
- Jmeter作为工具的性能测
[原创]相对完整的一套以Jmeter作为工具的性能测试教程(接口性能测试,数据库性能测试以及服务器端性能监测) 准备工作 jmeter3.1,为什么是3.1,因为它是要配合使用的serveragent ...
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第六章 2(Binary Trees)
112 - Tree Summing 题目大意:给出一个数,再给一颗树,每个头节点的子树被包含在头节点之后的括号里,寻找是否有从头节点到叶子的和与给出的数相等,如果有则输出yes,没有输出no! 解题 ...