程序员对于MVC(Model View Controller)模式比较熟悉,其实MVP(Model View Presenter)模式是从MVC模式的派生出来的。MVP模式在Android开发中非常重要,越来越多的开发者在项目中使用MPV。我写下这篇博客,希望开发者来一起讨论如何将MVP更好的应用到我们的项目中。
什么是MVP模式
MVP模式将表现层和逻辑完全分离。在理想情况下,同样的逻辑可以拥有完全不同的视图,可以很轻松的变换视图。需要澄清一件事,MPV模式并不是一种架构模式,它仅负责表现层而已。
为什么要用MVP模式
在Android开发中,有一个问题就是,activity或者是fragment与View和model非常亲密(高耦合)。为了应用程序能够方便的扩展和维护,我们需要对它很好的分层。假如有一天,我们不从本地数据库获取数据了,而是从web service获取,那么不至于重写整个View。
MVP模式让Views和data soruce完全独立。我们将应用程序分为至少三层,这样可以方便的对它们进行独立测试,用MVP模式我们可以将大部分业务逻辑从activity中剥离出来,这样可以脱离用户界面进行测试。
Android中如何实现MVP模式
MVP模式非常的灵活多变,没有固定的形态,选择一种自己觉得舒服的方式去实现。模式的变化主要取决于我们委托给presenter的任务多少。
举个例子,显示或者隐藏一个progress bar,是应该交给View来做呢?还是Presenter来做呢?谁来决定ActionBar中的显示呢?很难选择对吧?接下来我将说明我通常的做法。
presenter
presenter作为View和model的一个中间人。它从model中获得数据,然后按照约定的格式返回给View。但是并不像传统的MVC模式,它会决定当你和视图交互时候的结果。
View
View,这里的View是定义的接口,其实应该叫IView(Interface view),通常View是由Activity或者Fragment来实现,它持有一个presenter的引用。View中需要做的事情就是,当用户交互的时候(例如按钮点击)调用Presenter的方法(委托给Presenter)。
Model
一个好的应用程序架构,model应该只在领域模型活着业务逻辑层中可见。model包含一些use case的实现。这里的model只把他看作是数据的提供者。
实例讲解
说了这么多,还是来一个例子比较实际一点儿,这个例子,是模拟用户登录。当用户点击登录按钮之后,对数据进行验证,提交等一系列操作。源码下载
mvp模式实例类图
上面的图中LoginInteractor只是代表Model的一部分,从图中可以看出View层与Model层完全隔离,由Presenter进行交互。Presenter分别持有View和Model的引用,Presenter充当一个中间人的角色。这里不对代码做详细讲解,有兴趣的同学自行下载代码学习。
总结
在Android开发中实现界面与逻辑的完全分离并不容易,但是Model-View-Presenter模式至少可以避免让Activity出现几百上千行的糟糕情况。在大型的项目中组织好程序架构非常重要,否则会变得非常难以维护和扩展。