在我们讨论MVP架构之前,我们要先了解理解一下MVC架构。
MVC架构以及MVC结构在安卓中的弊端
MVC架构指Model-View-Controller.是一种将业务逻辑、视图和数据分离开来的架构方式。View是指界面展示,Model是指持久层模型,View指界面的展示,Controller用于逻辑控制。
如果在安卓中使用MVC架构,那么XML文件用于承担View的职责,而持久层对象承担Model的职责,Activity承担Controller的职责。由于在安卓中,Activity随着屏幕的翻转而不断地执行自己的生命周期中的方法,这使得Controller的职责过重。同时MVC架构中,View与Model存在很强的耦合。所以MVP模式被发明出来,解决问题。
MVP架构
MVP架构指Model-View-Presenter。与MVC架构唯一不同的是,MVP架构采用了Presenter的机制。
Presenter可以理解为一个交互中间人,它从Model层得到了数据之后,传送给View,这样Model与View之间的耦合就被解除了。这样Presenter是纯逻辑性质的,甚至负责原来View承担的一部分逻辑控制工作,减轻了原来View的职责。
View通常由activity、fragment以及view控件负责,他们也会持有Presenter的引用,当view上有操作发生时,他们会调用Presenter的相应方法进行处理。
所以Presenter与View是相互持有引用。
MVP进行了View与Model之间的解耦,使得安卓软件的可测试性提升,同时MVP大大降低了activity类的复杂度。
MVP项目实战分析
我选择谷歌官方提供的MVP项目,一个todoapp来进行分析。
这个项目采用了MVP架构,它按照功能点来划分模块。
此项目有一个presenter基类BasePresenter,以及一个view基类BaseView,
在BaseView中,有setPresenter方法。因此继承了BaseView的类他们都依赖于一个Presenter接口。在activity生命周期过程中调用的方法中,只会重新给view注入他们依赖的presenter接口,而不是重复执行大量的逻辑代码。
在每个模块中,都写了一个contract接口,里面声明了View和Presenter接口,声明了相应的功能。
以addedittask模块为例。
项目地址:https://github.com/googlesamples/android-architecture/tree/todo-mvp/