MVP for Android

翻译自 MVP for Android: how to organize the presentation layer
原文地址

MVP(Model View Presenter) 模式是从著名的 MVC(Model View Controller)中衍生出来的.MVC 有段时间哪怕是现在在 Android 应用开发中也是有着举足轻重的作用.现在有越来越多的人们讨论它(MVP),但是却少有可靠的和结构清晰的信息.这就是为什么我想通过这篇博客来以带动讨论从而使得我们开动脑筋以期可以将它以最好的方式应用到我们项目当中去.

什么是 MVP

MVP 模式允许从逻辑上将展示层分离开,那就意味着接口是如何工作将会从如何展示中分离出来.理想状态下如果 MVP 模式实现这些逻辑,它将拥有完全不同的和可交互的视图.

首先需要澄清的是 MVP 不是一个结构化的模式,它只对展示层有效.无论如何在你的架构中使用它总归会更好一点.

为什么使用 MVP

在 Android 中我们有一个问题,问题来源于 Android 的活动与接口和数据访问机制紧密耦合.我们可以找一些极端的例子,比如说 CursorAdapter,其在使用光标的情况下混用了多个适配器,按道理说光标应该归入到深层的数据访问层.

对于一个应用来说如果想要易拓展和易维护的话,我们需要很好的定义各个分离的层.将来的趋势是什么,从一个 Web 服务器的数据库检索相同数据?我们需要重新装饰我们所有的视图.

MVP 模式可以让视图和我们的数据源独立开来.我们将应用分成不少于三个不同的图层(layers)来测试他们的独立性.
使用 MVP 我们可以将绝多数的逻辑从活动分离出来,那样的话,我们可以在没有使用任何仪器下测试.

如何在 Android 中实现 MVP

这是就是低耦合的开始.这里有许多不同种类的 MVP 并且每个人都可以调整模式去适应他们自己的需求,以便更舒服的使用它.模式种类基本上取决于我们给 presenter 的责任多少.

视图有责任去启用和禁用进度条,或者它由 presenter 去完成吗?又由谁决定在 Action Bar 展示什么行为?这就是最艰难的决定开始的地方.我将会介绍通常我是如何工作的.但是我更希望这篇文章成为更严格的应用 MVP 模式的指导方针的讨论的地方,因为我们都知道这里没有一个标准的方法去实现它.

The Presenter

presenter负责充当视图和模型之间的中间人.它从模型中检索数据,然后将它格式化的返回到视图中去.但是与典型的 MVC 模式不同的是,它同样决定当你与视图交互的时候发生什么.

The View

视图通常由一个活动(它可能是一个 Fragment,一个 View…取决于这个 app 是如何架构的)继承实现(implemented),其中包含一个 presenter 的引用.Presenter 将会提供一个独立的注入就像Dagger.但是如果你不使用这样的东西,它将负责创建一个 presenter 对象.视图需要做的唯一一件事情就是当一个接口执行的时候,调用 presenter 其中的方法.

The model

在拥有一个良好的分层架构的应用程序中,这种模式只会通往域层或业务逻辑.如果我们正在使用Uncle Bob clean architecture ,模型可能是一个实现了一个用例的交互器.但这是另一个话题,我想在以后的文章中讨论.现在,我们可以意识到它可以作为我们希望显示在视图中的那些数据的提供者.

例子

由于它解释起来有点冗长的,因此我在 Github 上创建了一个 MVP 样例,样例包含一个登陆页面验证数据,验证成功后访问包含从模型中检索的一系列表数据的主页.本文并没有对代码进行任何解释,因为代码相当简单.当然如果你觉得理解起来比较困难 的话,我将再写一篇文章详细的解释它.

结论

将界面与逻辑分离开在 Android 并不容易,但是 Model-View-Presenter 模式使得我们的活动,包含上百行甚至上千行的耦合的类得以解耦.在大型应用程序中组织好我们的代码至关重要.如果没有做好这点,维护和拓展就无从谈起.