前情提要
由于公司项目结构调整,很多工作都已经停止了,终于有时间闲下来写写技术总结了。
作为一个项目,最主要的就是整个项目的组织结构,结构决定整个项目的可读性和延展性,特别是对于团队开发尤其重要。
在介绍MVP模式之前先介绍一下大家比较熟悉的MVC,有对比才能更好的了解。
MVC模式
即Model-View-Controller。M:模型,V:视图,C:控制器。Model是数据结构和对应的操作,是整个项目的核心,View负责在屏幕上面展示可视的图形信息,Controller负责接受和处理各种点击事件,已经页面的逻辑控制,提供数据给View层。
准确的说,Android中并不是严格意思上面的MVC。
- M是Android中的数据库,javabean,res下面的资源文件,网络连接,以及相关操作
- V是Activity以及布局文件
- C其实也是Activity
activity既有展示UI的作用,又有流程控制的作用,如果项目流程稍微复杂一点,acitivity就会变得十分庞大。难以阅读,也不符合解耦的规则。为了解决这个问题,MVP的架构模式这几年在Android界悄然兴起。
MVP模式
即Model-View-Presenter,M:模型,V:视图,P:表示器。这里的P和MVC中的C都具有流程控制的作用,不同的是MVC中V可以直接和M交互,而MVP中,V只能和P交互,P具有控制和连接V和M的作用,这样使得结构更加清晰,流程更加简单,并且V和P是通过接口进行交互的,这样使得耦合度更低,也更加便于进行单元测试。
因此在Android中Activity就得到了大解放,只需要负责show 数据,将监听到的各种事件传递给presenter即可,简单明了。
Presenter负责处理事件,并且准备数据,调用activity的show方法即可。
Model则负责提供数据和进行数据的处理加工。
具体的代码就不贴出来了,分包看个人喜好,这里附上一张登录图:
当然MVP并不全是优点,也有缺点,这样的结构必然会导致接口和类的暴增,如果项目本身定位并不大,则不建议使用这个框架,例如一个很简单的功能,你必须写出只是三个文件来,过于条条框框了,没有必要。
基于MVP解耦的思想,又衍生出了MVVM,既Model-View-ViewModel,Model和View层耦合度更低。
View:单纯的关心布局,颜色,动画等和UI相关的代码逻辑,不再负责显示数据和回传请求设置监听等和数据相关的逻辑。
Model:只需要处理数据,返回结果,不用关心页面逻辑。
-
ViewModel:处理业务流程,获取业务数据,但是不负责处理数据,也不持有ui的引用。
优点就是,高度解耦,逻辑清晰,便于扁平化开发,互相不牵制。
缺点自然是,需要引入其他库,进行逻辑和控件的绑定工作,例如DataBinbing等MVVM的支持库,写法上也和熟悉的Android不同