MVP与MVC的主要区别是View与Model不直接交互,而是通过与Presenter来完成交互,这样可以修改视图而不影响模型,达到解耦的目的,实现了Model和View真正的完全分离。视图的变化总是比较频繁,将业务逻辑抽取出来,放在表示器中实现,使模块职责划分明显,层次清晰,一个表示器能复用于多个视图,而不需要更改表示器的逻辑(当然是在该视图的改动不影响业务逻辑的前提下),这增加了程序的复用性。数据的处理由模型层完成,隐藏了数据,在数据显示时,表示器可以对数据进行访问控制,提高数据的安全性。以前的Android开发是难以进行单元测试的,但是随着项目变得复杂,测试时保证应用质量的关键,MVP模式中,表示器对视图是通过接口进行的,可以利用测试驱动,模拟出视图对象,实现视图相对于表示器的接口,就可以对表示层进行不依赖于UI环境的单元测试了,这大大降低了Android应用开发中的业务逻辑测试难度和复杂度。MVP模式的引入,视图层完全不依赖与模型层,相当于将视图从特定的业务场景中脱离出来,做到了对业务完全不可知的状态,因此可以将视图层组件化,提供一系列接口供表示层操作,这样就可以做出高度可复用的视图组件了。
MVP的明显缺点是增加了代码的复杂度,特别是针对小型Android应用的开发,会使程序冗余。Presenter中除了应用逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,会导致Presenter臃肿,维护困难。视图的渲染过程也会放在Presenter中,造成视图与Presenter交互过于频繁,如果某特定视图的渲染很多,就会造成Presenter与该视图联系过于紧密,一旦该视图需要变更,那么Presenter也需要变更了,不能如预期的那样降低耦合度和增加复用性。
曾露.MVP模式在Android中的应用研究[J].软件,2016,37(6):75-78.
张正龙,陈永政.浅谈MVP设计模式[J].科学咨询,2014,(28):71-71.
朱滕威.基于Android的开发模式研究[J].环球市场,2018,(15):388.