Android上的MVP模式:如何组织表示层?

本文是对Antonio Leiva关于MVP的一篇博文的中文翻译。查看原文可点击这里
翻译加入了一些自己的理解,如有不妥之处,希望大家指正。以下是原文翻译:

MVP(Model View Presenter)模式衍生自著名的MVC(Model View Controller)模式。
MVC长一段时间都在Android应用开发中占据着重要的地位。
现在由越来越多的人谈论MVP,却鲜有可靠而组织化的资料。
因此我想要通过这篇博文来促进大家的讨论,并让大家将所学的知识尽可能最优地应用到我们的项目中,

什么是MVP?

MVP模式将表示层从逻辑层分离,这样一来,就把 内部接口如何工作? 和 我们怎样将接口处理的结果展现到屏幕上? 进行了分离。
概念上来说,MVP模式可以让同一套逻辑拥有完全不同的可交替的界面。

首先需要阐明的一点是,MVP不是架构模式,它仅仅负责表示层。任何情况下,在你完全没有使用MVP的架构中加入MVP总是件好事。

为什么要使用MVP?

在Android开发中,我们不得不面对一个严峻的事实:Activity高度耦合了用户接口和数据获取机制。甚至还能找到像CursorAdapter这样的极端例子。
这个例子中,CursorAdatper将Adapter(可认为是View的一部分)和 cursor(可认为属于数据访问层)整合到了一起。

为了能够轻松地扩展和维护一个应用,我们需要定义良好分离的层次结构。如果明天我们不再从数据库获取数据,而必须从web服务器上获取数据,
我们该怎么办呢?如果各个层次都高度耦合的话,我们就只能重写整一个view了。

MVP将view从我们的数据源独立出去。我们将应用分为至少三层,这样我们可以分别对它们进行测试。通过MVP,我们可以将大部分有关业务逻辑的方法从
Activity中移除,因此我们讲可以在不使用instrumentation tests的情况下对其进行测试。

如果实现Android中的MVP?

好吧,从现在开始,问题就变得有点模糊不清。实际上,存在着很多的MVP实现变体,任何人都可以根据他的想法将MVP调节成他所喜欢的形式。
这些不同基本上取决于我们委派给Presenter的任务数量。

到底是该由view来负责启用或禁用一个进度条,还是该由presenter来负责呢?又该由谁来决定action bar应该显示什么动作呢?这就是抉择v开始的地方。
我将会向你展示我常用的方法,但我也希望这篇文章成为讨论MVP详细实现规范的地方,因为到目前为止,还不存在一套“标准”的方式来实现它。

The Presenter

Presenter负责担任view和model之间的中间人。它从model取回数据,并将其格式化后返回到view中。
和传统的MVC模式不同,Presenter还决定了当用户和view进行交互时该如何响应。

The View

View通常是一个Activity(也可以是一个Fragment,一个View,这取决于App的结构),它包含了一个对Presenter的引用。
理想情况下,Presenter是通过依赖注入的方式提供的(比如通过Dagger),但如果你没有使用这类工具,也可以直接创建一个Presenter对象。
View需要做的唯一一件事就是:当有界面动作发生时(比如一个按钮被点击了),调用Presenter中的相应方法。

The Model

在一个拥有良好的层次结构的应用中,这里的Model指的是与域层(domain layer)或者业务逻辑层进行交互的唯一途径。
如果我们使用的是鲍勃大叔的整洁架构(Uncle Bob clean architecture)
Model这时候也许就是一个实现了一个用例的交互器(interactor),不过这又是另外一个话题了,我想我会在以后的文章中讨论它。
现在,将Model看做是一个给View提供数据(用于界面展示)的提供者就足够了。

一个例子

由于字面解释过于冗长,我在github上创建了一个实例
实例包含了一个登录界面,该界面用于验证登录信息,然后让用户访问主界面。主界面包含了一个从Model中获取数据的列表。
这篇文章并没有解析例子中的任何的代码,因为这十分简单。但如果你发现其中有理解困难的地方,我会新写一篇文章来对其进行详细的解释。

总结

在Android上将接口和逻辑分离并不简单,但通过MVP模式,我们可以更容易地防止Activity退化成高度耦合的、包含了成百上千行代码的类。
在大型应用开发中,将代码组织好是很有必要的。否则,对代码的维护和扩展都会变得不切实际。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容