原文
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返回的列表的首页.这篇文章没有解释任何代码,因为那很简单,如果你觉得难以理解,我会在写一篇文章详细解释.
MVP demo地址:https://github.com/antoniolg/androidmvp
结论
把逻辑和界面分离并不容易,但是MVP模式可以防止我们的activities最终退化成非常耦合的类,包含数百或数千行代码.在大型应用中组织好我们的代码是至关重要的.否则,就不可能维护和扩展.