从学安卓以来一直都是使用的MVP模式,记得当时学长学姐说MVP模式方便管理,方便单元测试。就一直这样用着了,中间也单独拿出来看过两次,但是没有一个很深的印象。
最近被问到,MVP模式的优缺点是什么,跟MVC、MVVM有什么区别,一下懵住了,就记得方便管理,其他的什么都想不起来了。
这里浅浅记录一下。
MVC模式
MVC模式中 M层指的是Model(模型),V层指的是View(视图),C层指的是Controller(控制器)
M层:写的是JavaBean实体类,保存示例数据
V层:显示数据,接收用户输入,提供界面与用户交互
C层:更新UI界面和数据实例
MVC中的activity属于V层,但同时又包含了一些Controller一些相关的东西,这样在写到相同内容的时候会需要重复写很多次,使代码变臃肿了耦合度也高,不利于开发和维护。比如,View层接受用户的输入,然后通过Controller修改对应的Model实例;同时,当Model实例的数据发生变化的时候,需要修改UI界面,可以通过Controller更新界面。这种操作可行,但是没必要。
优点:使视图和数据分离,对于开发大型软件来说更方便进行模块的划分,提高编码速度与质量
MVP模式
MVP模式中 M层指的是Model(模型),V层指的是View(视图),P层指的是Presenter(表示器)
M层:提供想要展示在View层的数据和具体业务逻辑的处理实现
V层:显示数据,接收用户输入,提供界面与用户交互
P层:直接定义处理View的方法、传递M层对V层的处理、V层对M层的回应处理
MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model。
这种将M层与V层分开处理一个最合理的理由就是,Android中的UI操作是异步的,得在主线程里面操作。
P层与V、M层的交互使用接口定义操作,可以进一步达到松耦合的目的也更方便做单元测试。
与MVC相比MVP的优势就是:
1、Activity只处理生命周期的任务,代码变得更加简洁
2、Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试
3、把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存泄露和OOM
4、分离了视图逻辑和业务逻辑,降低了耦合
MVVM模式
MVVM模式中 M层指的是Model(数据层),V层指的是View(视图层),VM层指的是ViewModel(关联层)
M层:主要负责网络数据操作,File文件操作,本地数据库操作
V层:主要负责布局加载和UI交互
VM层:负责数据变化自动更新绑定的View以及View的操作更新绑定的数据
MVVM与MVP区别不是很大,他也降低了耦合,注重组件化,主要把V和M绑定到一起了。
优点:View和Model是双向绑定的,使开发者不用专注于更新视图,只需要专注于实现业务逻辑,绑定了Model简化了Model的逻辑控制
缺点:
使页面异常追踪变得复杂,因为可能是View导致的bug,也可能是Model导致的;
数据双向绑定不利于代码复用,View都绑定了一个Model,不同模块的Model都不同,就不能复用View;
Model 长期持有,不释放内存,就造成了花费更多的内存;