简称:MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

中文名

MVP模式

外文名

MVP mode演    变

MVC

方    式

直接Model中读取数据

逻    辑

Presenter

MVP模式概述

编辑

MVP从MVC演变而来,通过表示器将视图与模型巧妙地分开。在该模式中,视图通常由表示器初始化,它呈现用户界面(UI)并接受用户所发出命令,但不对用户的输入作任何逻辑处理,而仅仅是将用户输入转发给表示器。通常每一个视图对应一个表示器,但是也可能一个拥有较复杂业务逻辑的视图会对应多个表示器,每个表示器完成该视图的一部分业务处理工作,降低了单个表示器的复杂程度,一个表示器也能被多个有着相同业务需求的视图复用,增加单个表示器的复用度。表示器包含大多数表示逻辑,用以处理视图,与模型交互以获取或更新数据等。模型描述了系统的处理逻辑,模型对于表示器和视图一无所知。[1]

MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter(MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过Controller。[2]

MVP模式优势

编辑

MVP模式下表示层的优势体现在下面三个方面:

1、View与Model完全隔离。

得益于此,Model和View之间具有良好的松耦合设计,这意味着,如果Model或View中的一方发生变化,只要交互接口不变,另一方就没必要对上述变化做出改变。这使得Model层的业务逻辑具有很好的灵活性和可重用性。

2、Presenter与View的具体实现技术无关。

也就是说,采用诸如Windows表单,WPF,Web表单等用户界面构建技术中的任意一种来实现View层,都无需改变系统的其他部分。甚至为了使B/S,C/S部署架构能够被同时支持,应用程序可以用同一个Model层适配多种技术构建的View层。

3、可以进行View的模拟测试。

过去,由于View和Model之间的紧耦合,在Model和View同时开发完成之前对其中一方进行测试是不可能的。出于同样的原因,对View或Model进行单元测试很困难。现在,MVP模式解决了所有的问题。在MVP模式中,View和Model之间没有直接依赖,开发者能够借助模拟对象注入测试两者中的任一方。[3]

MVP模式MVC & MVP

编辑

MVP是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,

MVP模式Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter(MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过Controller。

在MVC里,View是可以直接访问Model的。从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示及View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。 [2]

MVP模式问题改进方式

编辑

在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,即重用。不仅如此,我们还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试--而不需要使用自动化的测试工具。我们甚至可以在Model和View都没有完成时候,就可以通过编写MockObject(即实现了Model和View的接口,但没有具体的内容的)来测试Presenter的逻辑。在MVP里,应用程序的逻辑主要在Presenter里实现,其中的View是很薄的一层。因此就有人提出了PresenterFirst的设计模式,就是根据UserStory来首先设计和开发Presenter。在这个过程中,View是很简单的,能够把信息显示清楚就可以了。在后面,根据需要再随便更改View,而对Presenter没有任何的影响了。如果要实现的UI比较复杂,而且相关的显示逻辑还跟Model有关系,就可以在View和Presenter之间放置一个Adapter。由这个Adapter来访问Model和View,避免两者之间的关联。而同时,因为Adapter实现了View的接口,从而可以保证与Presenter之间接口的不变。这样就可以保证View和Presenter之间接口的简洁,又不失去UI的灵活性。在MVP模式里,View只应该有简单的Set/Get的方法,用户输入和设置界面显示的内容,除此就不应该有更多的内容,绝不容许直接访问Model--这就是与MVC很大的不同之处。

MVP模式优点

编辑

MVP与MVC的主要区别是View与Model不直接交互,而是通过与Presenter来完成交互,这样可以修改视图而不影响模型,达到解耦的目的,实现了Model和View真正的完全分离。视图的变化总是比较频繁,将业务逻辑抽取出来,放在表示器中实现,使模块职责划分明显,层次清晰,一个表示器能复用于多个视图,而不需要更改表示器的逻辑(当然是在该视图的改动不影响业务逻辑的前提下),这增加了程序的复用性。数据的处理由模型层完成,隐藏了数据,在数据显示时,表示器可以对数据进行访问控制,提高数据的安全性。以前的Android开发是难以进行单元测试的,但是随着项目变得复杂,测试时保证应用质量的关键,MVP模式中,表示器对视图是通过接口进行的,可以利用测试驱动,模拟出视图对象,实现视图相对于表示器的接口,就可以对表示层进行不依赖于UI环境的单元测试了,这大大降低了Android应用开发中的业务逻辑测试难度和复杂度。MVP模式的引入,视图层完全不依赖与模型层,相当于将视图从特定的业务场景中脱离出来,做到了对业务完全不可知的状态,因此可以将视图层组件化,提供一系列接口供表示层操作,这样就可以做出高度可复用的视图组件了。[1]

MVP模式缺点

编辑

MVP的明显缺点是增加了代码的复杂度,特别是针对小型Android应用的开发,会使程序冗余。Presenter中除了应用逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,会导致Presenter臃肿,维护困难。视图的渲染过程也会放在Presenter中,造成视图与Presenter交互过于频繁,如果某特定视图的渲染很多,就会造成Presenter与该视图联系过于紧密,一旦该视图需要变更,那么Presenter也需要变更了,不能如预期的那样降低耦合度和增加复用性。[1]

参考资料

1.

曾露.MVP模式在Android中的应用研究[J].软件,2016,37(6):75-78.

2.

张正龙,陈永政.浅谈MVP设计模式[J].科学咨询,2014,(28):71-71.

3.

朱滕威.基于Android的开发模式研究[J].环球市场,2018,(15):388.

mvp模式复用android,MVP模式相关推荐

  1. android mvp 利弊,android mvp模式有什么弊端 - 什么是android mvp模式,android mvp模式有什么弊端...

    android mvp模式有什么弊端 才开始学习使用MVP时,看到大家说了很多MVP的优点,代码复用,条理清晰等等.不过我改下来发现,MVP在我看来,最大的优点还是代码解耦,逻辑清晰,至于代码复用,暂 ...

  2. android mvp 代码范例,Android MVP开发模式有案例和源码,反正我能看懂的MVP

    丁先森 博客园 MVP 理论知识 在MVP 架构中跟MVC类似的是同样也分为三层. Activity 和Fragment 视为View层,负责处理 UI. Presenter 为业务处理层,既能调用U ...

  3. android自动夜间模式吗,Android夜间模式的实现方案

    原标题:Android夜间模式的实现方案 作者简介 本篇来自 Sunlight1024的投稿,详细地讲解了关于Android应用的夜间模式的实现,希望大家喜欢! Sunlight1024的博客地址: ...

  4. android 夜间模式功能,Android 夜间模式的三种实现

    实现夜间模式有很多种方式,经过多次尝试,算是找到了一种性价比较高的方式. 主题方式 这是最正统的方式,但工作量巨大,因为要全局替换 xml 布局中所有硬编码的色值,将其换成主题色.然后通过换主题达到换 ...

  5. android车载严格模式解除,Android严格模式

    我已经使用AsyncTask在JSON解析上编写了一个简单的代码.我只是在TextView中显示响应.我不知道这是对还是错.它在GingerBread上工作并在果冻豆上显示NetworkOnMainT ...

  6. android 夜间模式 框架,Android 夜间模式的三种实现

    实现夜间模式有很多种方式,经过多次尝试,算是找到了一种性价比较高的方式. 主题方式 这是最正统的方式,但工作量巨大,因为要全局替换 xml 布局中所有硬编码的色值,将其换成主题色.然后通过换主题达到换 ...

  7. android+mvp+登录案例,android mvp实现登录

    android的mvp是什么呢? Model:用于数据的增删改查等,也包括一些数据对象 ,主要用来处理一些业务操作. View:用于界面的显示与用户操作的接收,在Android里面View通常就是Ac ...

  8. Android MVP和Dagger2

    In this tutorial, we'll be implementing MVP pattern along with Dagger2 in our Android Application. I ...

  9. android 单手模式 cm,怎么开启单手模式 安卓自定义单手操作模式缔造教程

    手机屏幕做大了对于我们爪机党来说自然是视觉上的福利,但是大屏相反的给我们的操作带来了诸多的不便.相比不少厂家的定制和第三方ROM而言,一部大屏手机必须有一个合适的操作方式.单手模式自然是福利,但也不是 ...

最新文章

  1. 本硕非科班,单模型获得亚军!
  2. stream 的方式遍历(亲测)
  3. pydev集成mysql_【Python】Windows平台下Python、Pydev连接Mysql数据库
  4. predefined data types in UI5
  5. jsf集成spring_Spring和JSF集成:转换器
  6. C# 大数组赋值给小数组,小数组赋值给大数组
  7. 后台产品基本功:RBAC权限后台角色与权限设计
  8. 升级win11-需要开启主板的tpm2.0
  9. 温故知新----表格
  10. java复制pdf_java – 使用iText复制带注释的PDF
  11. 计算机flash教案,flash教学计划
  12. LaTex下载与安装教程
  13. Python学员信息管理系统
  14. 包装类-自动装箱和自动拆箱
  15. LTE学习理解系列——TDD LTE信源指定时隙配比设置
  16. Excel VBA-正则表达式汇总
  17. Oracle 官网网址
  18. 丢掉迅雷,1M的下载神器让你下载飞起来,NDM/XDM分享
  19. Memory Hierarchy-计算机各级存储器速度对比
  20. JAVA简易通讯录系统

热门文章

  1. Android 根据屏幕大小设置字体
  2. 用c++设计一个表示二维圆形的Circle类,用于计算空心圆环的体积和重量。
  3. web服务器(一)实验报告
  4. 5.HTML图片的格式
  5. java 斜杠 linux_windows与linux中的路径书写,斜杠、反斜杠用法总结
  6. 计算机信息管理员考试知识点,网络管理员考试知识点1—计算机硬件基础
  7. uni-app小程序授权登陆示例
  8. 转 Office技巧集锦
  9. HTML5全球普及将加速 或终结iOS与安卓界限
  10. RS422串口测试工装研究