适用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 ...
随机推荐
- PHP 使用Apache 中的ab 測试站点的压力性能
打开Apacheserver的安装路径(我用的是 WampServer),在bin文件夹中有一个ab.exe的可运行程序,它就是要介绍的压力測试工具. watermark/2/text/aHR0cDo ...
- 小白学开发(iOS)OC_ SEL数据类型(2015-08-10)
// // main.m // SEL数据类型 // // Created by admin on 15/8/12. // Copyright (c) 2015年 admin. All rig ...
- crm2011处理save事件和获取当前窗口信息
//防止保存记录,eContext:当前上下文对象 function My_PreventSaveFunction(eContext) { eContext.getEventArgs().pr ...
- 13.Axis创建webservice客户端和服务端
转自:https://blog.csdn.net/chenghui0317/article/details/9318317 一.Axis的介绍 Web Service是现在最适合实现SOA的技术,而A ...
- 57.C++处理转义字符
#include <iostream> #include <string> #include <cstdlib> using namespace std; void ...
- 学大伟业Day解题报告
预计分数:30+30+0=60 实际分数:30+20+0=50 题解部分全部来自http://www.cnblogs.com/TheRoadToTheGold/p/7723564.html T1htt ...
- 2017国家集训队作业[agc006f]Blackout
2017国家集训队作业[agc006f]Blackout 题意: 有一个\(N*N\)的网格,一开始有\(M\)个格子被涂黑,给出这\(M\)个格子,和染色操作:如果有坐标为\((x,y),(y,z) ...
- Linux-PS1变量详解
1.PS1 要修改linux终端命令行颜色,我们需要用到PS1,PS1是Linux终端用户的一个环境变量,用来说明命令行提示符的设置.在终端输入命令:#set,即可在输出中找到关于PS1的定义如下: ...
- Java数据传递实验
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 在开发过程中,我们经常会遇到对象传递的问题,有时仅仅传递数据,有时却要实现数据同步:这时,就要分清两 ...
- cocos2d-x cocoStudioUI编辑器导出文件的使用
代码演示样例: UILayer* layer = UILayer::create(); layer ->addWidget(CCUIHELPER->createWidgetFromJson ...