Android MVP 探究与总结

2015-08-11 18:15:40 +08:00
 Bison

导读:在Android的开发过程中,Activity承担了大量地工作。如果对整个项目十分了解,并且在开发过程中有意识地抽离出了一些通用层的话,维护起来还稍微好一点,但实际上我们经常会遇到这样一些情况:维护并迭代已有地商业项目(可能前几期并不是由你开发);UI变动极大(是不是经常Crtl+f到处查找?)...

如果按照MVC的项目结构来说,Activity应该是属于View这一层。而实质上,它既承担了View,更多地却包含一些Controller的东西在里面。这对于开发与维护来说极度不利,耦合度大高了

那么有没有什么解决方案呢?答案当然就是本文所讲述的——MVP了

什么是MVP?

虽然说MVP已经出来很有一阵了,网上关于讲解这方面的文章也不少,但实际上真动手写起来时,还是有一些不顺畅。这没有更好的办法,唯有多练,多练,多练(重要的事情说三遍)。

什么是MVP呢?

MVP是Model, View和Presenter的简称。是MVC模式的演化版。MVP模式把显示逻辑和从业务逻辑层中分离出来,理想状况下,视图层变更替换过程中,可以实现相完全相同的逻辑代码。

下面看一张图

从上图可以看出,Presenter层成了Model与View之间的桥梁,Model与View之间不再直接进行交互。而Presenter持有Model与View的引用,完成了对逻辑地处理。将这个模式代入到Android中,我们可以将他丰富成这样(如下图)

相信对MVC,大家都是非常熟悉了,不再多言,一图以蔽之

通过与MVP结构图对比着看可以发现:

在MVC结构中,Model是可以直接被View操作的。其实这就是MVP与MVC最大的一个区别。

MVP有什么用?

或者可以这样问MVP有什么好处?为什么要使用MVP?
其实通过上面的几张图就不难看出

其实,说这么多,都是因为显示层与逻辑层分离带来地便利。

如何使用MVP?

都说MVP抽离了层结构,降低了耦合度,那么它到离是如何抽离的?当然是通过接口了。

Presenter中通过对接口的操作,可以完全不关心View层与Model层的具体实现,只需要处理对应逻辑就可以了。而在View层中,即Android的Activity与Fragment中,只需要持有一个Presenter的对象,以完成界面交互。这样咱们的View层就变得非常地薄了。所以,总结了一下,使用MVP,可以从以下几个方向思考:

以上,MVP理论上来说可以实现在多人协作项目中,让写UI的人与写逻辑的人分工而行,也更方便于在开发过程中进行单元测试。鉴于文章长度问题,具体地实际应用我们放在下章再说,我们一起来一步步实现一个MVP模式的Android应用

7230 次点击
所在节点    Android
6 条回复
nicktogo
2015-08-11 19:16:15 +08:00
坐等实现讲解
WispZhan
2015-08-11 20:33:26 +08:00
直接看android studio 1.3 支持的 databinding 和 mvvm 吧。
Bison
2015-08-12 16:10:42 +08:00
@WispZhan MVVM中的ViewModel其实就是MVP中的Presenter。只不过MVP中Presenter能操作Model层,但Model层不能操作Presenter.而MVVM中的ViewModel与Model是支持双向绑定的。于Android而说,MVVM估计未来会更受欢迎一些。
Bison
2015-08-12 16:10:59 +08:00
@nicktogo 感谢支持
HsienJiajun
2015-08-19 11:13:26 +08:00
用过 mvp ,要写很多接口,现在 android 官方出了 databinding ,以后应该会引导大家往 mvvm 走吧。
kaedea
2015-10-08 19:42:28 +08:00
MVP 还可以进一步优化, P 和 V 的交互

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/212456

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX