Android -- 每日一问:谈谈MVC、MVP和MVVM模式,你有在自己的项目中使用过吗?

news2024/11/17 1:42:56

经典回答

MVC 模式

image.png

全名是Model–View–Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中 Model 层处理数据,业务逻辑等;View 层处理界面的显示结果;Controller 层起到桥梁的作用,来控制 View 层和 Model 层通信以此来达到分离视图显示和业务逻辑层。

我们往往把 Android 中界面部分的实现也理解为采用了 MVC 框架,常常把 Activity 理解为 MVC 模式中的 Controller 。

MVP 模式

MVP 其实是 MVC 的一种演进版本,它更简单,将 MVC 中的 Controller 改为了 Presenter,View 通过接口与 Presenter 进行交互,降低耦合,方便进行单元测试。

View:负责绘制UI元素、与用户进行交互(Activity、View、Fragment都可以做为View层);
Model:对数据的操作、对网络等的操作,和业务相关的逻辑处理;
Presenter:作为View与Model交互的中间纽带,处理与用户交互的逻辑。可以把Presenter理解为一个中间层的角色,它接受Model层的数据,并且处理之后传递给View层,还需要处理View层的用户交互等操作。

我们看看如下的MVC和MVP的对比图更能直观的理解这两种模式的区别:
image.png

最明显的区别就是,MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。

如何在自己的项目中使用 MVP ?
官方给我们写了一些MVP的样例工程,用不同的概念和工具实现同一个Todo项目。

Github地址

  • todo-mvp/ - mvp基础架构示例。
  • todo-mvp-loaders/ - 基于mvp基础架构项目,获取数据部分使用了Loaders架构。
  • todo-databinding/ - 基于mvp基础架构项目,使用了数据绑定组件。
  • todo-mvp-clean/ - 基于mvp基础架构项目,使用了clean架构的概念。
  • todo-mvp-dagger/ - 基于mvp基础架构项目,使用了dagger2进行依赖注入。
  • todo-mvp-contentproviders/ - 基于todo-mvp-loaders架构项目,使用了Content Providers
  • todo-mvp-rxjava/ - 基于mvp基础架构项目,全名用RxJava进行并发和数据层处理。

MVP 的好处与问题
当你了解清楚 MVP 模式后,它的好处也就很明显了:

  1. UI层和逻辑层分离,UI层不在涉及业务逻辑代码,某层的改动不需要到处去修改代码;
  2. 测试很方便,你可以直接调用Presenter层写测试用式(可以使用Junit框架);
  3. 最后是可维护性和可扩展性,MVP的各个类职责都非常明确且单一,后期的扩展,维护都会更加容易。

当然,坏处也很明显,首先代码类增加了,一个小功能你可能要为它专门写 Presenter 和 Model 层的实现,以前这些你一口气就加在 View 层了。同时需要对新进项目的人员进行一些 MVP 模式的培训,以便他们不会写出破坏已有模式的代码。

MVVM 模式

MVVM 模式(Model–View–ViewModel模式),和 MVP 模式相比,MVVM 模式用 ViewModel 替换了 Presenter ,其他层基本上与 MVP 模式一致,ViewModel 可以理解成是View的数据模型和Presenter的合体。

MVVM 采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然,这种模式实际上是框架替应用开发者做了一些工作(相当于ViewModel类是由库帮我们生成的),开发者只需要较少的代码就能实现比较复杂的交互。这一步对于我还是比较有吸引力了,可以少写很多模板代码。

image.png

官方在 Google I/O 2015 大会上推出来MVVM模式的支持函数库 Data Binding Library。在 Android Studio 2.1 Preview 3 之后,开始支持双向数据绑定,即在 View 层修改输入也会触发 Model 层的改变。
当然,做过 WinPhone 开发的人一定想起来了微软在很多年前就在使用MVVM模式了。

你的朋友是不是也在准备面试呢?你可以把今天的题目分享给好友,或许你可以帮到他。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计SSM基于的高速收费系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

防火墙双机热备配置实验

目录 一、实验拓扑 二、配置云 三、配置防火墙 四、分配FW的接口地址与安全区域 五、按图示进行配置 六、双机热备的配置 七、配置NAT 八、模拟双机热备的切换 一、实验拓扑 看上去挺复杂的其实这个实验还是比较简单的,Client1配置为IP 10.3.0.10 网关10.3.…

python教程十二 字典

字典 字典是另一种可变容器模型,且可存储任意类型对象。 字典的每个键值 key>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 ,格式如下所示: d {key1 : value1, key2 : value2, key3 : value3…

学会模态计算,你就掌握了结构振动冲击计算的核心

模态计算对于认识结构振动特性至关重要,通过模态计算可以得到模态的固有频率,振型,参与系数和有效质量等参数,模态计算的这些参数我们应该很熟悉,但是如果正确合理的使用这些结果指导工程计算,是我们今天讨…

[附源码]Python计算机毕业设计滁州市围棋协会Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

12月12日: 学习跟着猫叔写代码

视频地址:fastadmin系列教程:小白学习之路 学前准备 安装过程 数据库分析 关联查询搜索 数据校验 视图渲染 api登录注册 token验证 table表格_哔哩哔哩_bilibili 前两节是安装fastadmin操作(可参考我自己的文章) 11月30日:linux服…

当要测试的对象依赖另一个无法控制的对象(系统相关、第三方服务等),这个时候我们应该如何测试?

一.问题描述 判断文件是否有效的需求变更了:有效的文件扩展名存储在文件系统中,要测试的FileVerify类就依赖FileExtensionManager类,在这种场景下如何测试FileVerify类的逻辑呢? 1 public class FileVerify2 { 3 …

精品基于SSM的社区疫情防控平台

《基于SSM的社区疫情防控平台》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术: 开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库&…

(附源码)springboot螺丝加工厂订单管理 毕业设计 010346

题 目 springboot螺丝加工厂订单管理 目 录 摘要 1 1 绪论 1 1.1项目开发的背景 1 1.2项目开发的意义 1 1.3系统开发技术的特色 1 1.4论文结构与章节安排 1 2 螺丝加工厂订单管理 系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1数据流程 3 2.3.2业务流程 4 2.3 系统…

C++11标准模板(STL)- 算法(std::sort_heap)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 数据结构的堆物理结构是数…

百度地图(HTML5新特性)-全面详解(学习总结---从入门到深化)

目录 百度地图_账号和获取密钥 百度地图_初始化 百度地图_变更地图类型 百度地图_添加控件 百度地图_改变控件位置 百度地图_添加覆盖物 百度地图_自定义标注图标 百度地图_添加文本标注 百度地图_正/逆地址解析 百度地图_信息窗口 百度地图_规划驾车路线 百度地图_…

亚马逊、速卖通、阿里国际自动和手动广告的核心是什么?自己养买家号测评的好处

亚马逊等跨境电商平台在打造的新品期&#xff0c;因为选择的细分类目是非常精准刚需的&#xff0c;词少&#xff0c;所以一开始只开启了自动广告&#xff0c;自动广告跑起来&#xff0c;转化很好。 自动广告跑了一段时间之后&#xff0c;把自动广告里表现比较好的出单词都挑出…

冰雪旅游热开启!IU酒店与您畅游山水之间

连日来&#xff0c;全国多地不断调整疫情防控措施&#xff0c;提高科学精准防控能力。国家防疫“新十条”出台后&#xff0c;大众旅游热情明显增高。 据穷游网站内数据显示&#xff0c;去海南、云南等地避寒&#xff0c;或前往东北、新疆等地滑雪备受用户推崇。三亚、上海、成…

spark上传文件和追加文件到hdfs

val status uploadFile(“C:\Users\com\Desktop\测试数据\”,“/test/file/”,“报销单.docx”) if(status) println(“上传成功&#xff01;”) else println(“上传失败”) } /** 本地文件上传到 hdfs param localDirectory 本地目录 param hdfsDirectory hdfs目录 pa…

胰岛素海藻酸钠纳米粒(INS-SA-NP)|葡聚糖(Dextran)修饰Fe304纳米颗粒

胰岛素海藻酸钠纳米粒&#xff08;INS-SA-NP&#xff09;|葡聚糖(Dextran)修饰Fe304纳米颗粒 中文名称&#xff1a;胰岛素海藻酸钠纳米粒 英文名称&#xff1a;INS-SA-NP 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液…

flutter系列之:如丝般顺滑的SliverAppBar

文章目录简介SliverAppBar详解SliverAppBar的使用总结简介 对于一个APP来说&#xff0c;肯定会有一个AppBar&#xff0c;这个AppBar一般包含了APP的导航信息等。虽然我们可以用一个固定的组件来做为AppBar&#xff0c;但是这样就会丢失很多特效&#xff0c;比如将AppBar固定在…

Java基础 二维数组简介

一、二维数组的定义 当一维数组元素的类型也是一维数组时&#xff0c;便构成了“数组的数组”&#xff0c;即二维数组。二维数组定义的一般格式&#xff1a; dataType arrayName[length1][length2];其中&#xff0c; dataType 为数据类型&#xff0c; arrayName 为数组名&…

TDengine3.0与2.x数据库参数对比

TDengine 已经发布很长时间了&#xff0c;产品基本稳定下来了。 以下总结了 TDengine 3.0 与 2.x 数据库参数的一些变化&#xff0c;方便大家从 2.x 切换到 3.0。 注意&#xff1a;2.x 与 3.0 文件系统不兼容&#xff0c;不能直接升级。 2.x3.xdays单位&#xff1a;天&#xff…

云原生之使用Docker部署PESMCS Ticket工单系统

云原生之使用Docker部署PESMCS Ticket工单系统一、PESMCS Ticket介绍二、检查本地系统环境1.检查系统版本2.检查docker状态三、创建mariadb容器1.创建network2.创建数据目录3.创建mariadb容器4.查看mariadb容器状态四、创建PESMCS Ticket容器1.创建PESMCS Ticket容器2.查看PESM…

【黄啊码】如何用小程序实现世界杯参赛队伍投票

本次只分享小程序端的代码实现&#xff0c;后端每个人都有自己的实现方法&#xff0c;就不写在此。 好了&#xff0c;先看实现样式&#xff1a; 本次投票实现需要一个页面和一个弹窗实现&#xff0c;我们做的是淘汰赛部分&#xff0c;在此&#xff0c;黄啊码将淘汰赛部分直接选…