适用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 ...
随机推荐
- Scrum中的产品需求预审
原文作者:Mike Cohn 为了保持产品待办事项(product backlog)的整洁有序,我们须要召开product backlog refinement会议(有时也叫product backl ...
- ubuntu adb 安装
ubuntu 下adb 安装,其实就是下载一个adb,然后给它赋予可执行权限,最后在环境变量里添加一下罢了.具体如下 1.下载adb 这个工具其实是在sdk工具包里面的platform-tools文件 ...
- tensorflow 语法及 api 使用细节
1. tf.nn.conv2d 的参数 padding='SAME' ⇒ 卷积之前的大小和卷积之后的大小一致,默认使用全 0 填充: padding='VALID' ⇒ 也即仅适用其有效部分,而不使用 ...
- 33.IDEA + maven]在IDEA中打开一个maven项目,resolve完依赖后,缺少部分jar包问题
转自:https://www.cnblogs.com/zazalu/p/7649590.html [注意]作者只是对使用过程中遇到的问题提出了一个解决方案,但是本人在编写此解决方案文章的时候,对mav ...
- js --- for in 和 for of
前言:for of是ES6新增的循环方法.前面已经说到了 [JavaScript]for.forEach .for in.each循环详解.那for of又是怎么使用的? 一.使用例子 使用例子(一) ...
- vue -- config index.js 配置文件详解
此文章介绍vue-cli脚手架config目录下index.js配置文件 此配置文件是用来定义开发环境和生产环境中所需要的参数 关于注释 当涉及到较复杂的解释我将通过标识的方式(如(1))将解释写到单 ...
- OpenCV —— 图像局部与部分分割(一)
背景减除 一旦背景模型建立,将背景模型和当前的图像进行比较,然后减去这些已知的背景信息,则剩下的目标物大致就是所求的前景目标了 缺点 —— 该方法基于一个不长成立的假设:所有像素点是独立的 场景建模 ...
- spring bean中的properties元素内的ref和value的区别;* 和 ** 的区别
spring bean中的properties元素内的ref和value的区别 至于使用哪个是依据你所用的属性类型决定的. <bean id="sqlSessionFactory&qu ...
- ps---报告当前系统的进程状态
ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,两者输出略有不同.现在的大部分Linux系统都是可以同时使用这两种方式的. linux上进程有5种状态: ...
- JS ajax 应用 (下拉列表联动)
<script language="javascript"> var http_request=false; function send_request( ...