深入浅出理解Android开发框架中的MVC、MVP和MVVM模式

news2024/11/25 6:40:41

✍️作者简介:沫小北/码农小北(专注于Android、Web、TCP/IP等技术方向)
🐳博客主页:沫小北/码农小北 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN
🔔如果文章对您有一定的帮助请👉关注✨、点赞👍、收藏📂、评论💬。
🔥如需转载请参考【转载须知】

在Android应用程序的开发过程中,开发者们经常使用一些设计模式和架构,以确保代码的组织性、可维护性和可扩展性。本文将深入介绍三种常见的Android开发框架模式:MVC(Model-View-Controller)、MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel),以帮助您更好地理解这些模式的优势和使用场景。

1. MVC(Model-View-Controller)

模型(Model): 数据和业务逻辑的表示。处理应用程序的数据逻辑,负责数据的读写、验证和处理。

视图(View): 用户界面的表示。负责展示数据和接收用户输入,但不处理数据的修改。

控制器(Controller): 连接模型和视图的纽带。处理用户输入、更新模型和调整视图的显示。

MVC模式的优势在于分离关注点,但在Android中,它可能导致控制器变得庞大,难以维护。因此,MVC模式在Android开发中并不是最常用的模式。

在这里插入图片描述

2. MVP(Model-View-Presenter)

模型(Model): 与MVC中的模型相似,负责应用程序的数据逻辑。

视图(View): 负责展示数据,与用户交互,但不处理数据的修改。

主持人(Presenter): 连接模型和视图的桥梁。处理用户输入、更新模型并决定如何更新视图。

MVP模式通过将控制逻辑从视图中分离,降低了代码的复杂性,提高了可测试性。Presenter处理所有业务逻辑,而视图只负责用户界面的展示。

在这里插入图片描述

3. MVVM(Model-View-ViewModel)

模型(Model): 与MVC和MVP中的模型相同。

视图(View): 负责展示数据,但与MVP不同,视图直接与ViewModel交互。

视图模型(ViewModel): 连接模型和视图的中介。负责处理视图的展示逻辑,从而使视图与模型解耦。

MVVM模式在Android中广泛应用,它通过使用数据绑定技术,使视图和视图模型之间的同步更为简便。ViewModel负责处理所有用户界面的逻辑,而视图则负责展示数据。

在这里插入图片描述

MVC到MVP再到MVVM的发展

MVC被认为是解决用户控制大型和复杂数据集问题的通用解决方案。从经典MVC到MVVM,UI架构经过数次重大变迁,一些概念也在不断变化,架构和底层环境互相影响、适配,我认为时至今日,经典MVC已经不再是UI架构的正常选项。

最初是Thing、Model、View、Editor。后来经过讨论定为Model、View和Controller。

在70年代末,80年代初,我们并没有操作系统和消息循环,甚至鼠标的光标都需要我们的UI系统来自行绘制。假如我们面对的是鼠标、键盘驱动这样的底层环境,我们就需要一定的机制和系统来统一处理用户输入,实现指针系统,文本系统,焦点系统,并且分配给正确的view或者model来处理。这样也就不难理解为什么经典MVC中称controller是用户和系统之间的链接。

Model-View-Presenter是在MVC的基础上,进一步规定了Controller中的一些概念而成。

MVVM认为view应该是事件驱动,模型变化只是一种事件。

如何呈现是view的事,调用方只用给view一个data,view就只负责这个data的显示,调用者不用管view如何显示,只负责将data传递,view也不用管数据从何而来,只要将data以自己的方式呈现,并且时刻关注data的变化如何反映到view上来就好。

而双向绑定,则是一个附加产品,毕竟只有像textbox,form等会改变数据的UI不多,大部分UI都只是单向的呈现数据而已。不过有双向绑定在,则可以将view和调用方分离得更彻底,即获取数据不必在意特别的view,如一个日期是用户在textbox中输入,还是用calendar提取的无关紧要,因为那是view设计和安排的事。

Model 无法将数据“发送”给 View,因为它根本不知道 View 的存在,数据应该是由 Controller 持有,并显示出 View。因此,用户也不是直接操作 Controller,即使是输入 URL,也可以认为那是由 View 触发的(就像在 View 上点击了一个链接)。

因此,MVC 的处理流程是 V -> C -> M -> C -> V。

MVP 模式实际上就是 MVC,只不过这里面的 C 主要负责的不再是业务逻辑,而是界面逻辑了,比如何时显示/隐藏某个选项卡,绑定 View 事件等。

结论

选择适合项目的模式通常取决于项目的规模、需求和团队的经验。MVC、MVP和MVVM都有各自的优势和适用场景。MVC模式适合小型项目,MVP模式适用于中等规模项目,而MVVM模式则在大型、复杂的项目中表现得更为出色。

在深入理解这些模式的同时,通过实际项目的实践,开发者们可以更好地选择并应用适合自己项目的架构模式,从而提高代码的可维护性和可扩展性。

无论是哪个阶段,坚持努力都是成功的关键。不要停下脚步,继续前行,即使前路崎岖,也请保持乐观和勇气。相信自己的能力,你所追求的目标定会在不久的将来实现。加油!

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

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

相关文章

【React】Antd 组件基本使用

Antd 组件基本使用 第一步 安装并引入 antd 包 使用命令下载这个组件库 yarn add antd在我们需要使用的文件下引入&#xff0c;我这里是在 App.jsx 内引入 import { Button } from antd现在我们可以在 App 中使用 Button 组件 <div>App..<Button type"prima…

成都瀚网科技有限公司抖音带货的靠谱之选

随着电子商务的飞速发展&#xff0c;越来越多的商家开始利用网络平台进行产品销售。这其中&#xff0c;抖音作为一款广受欢迎的短视频平台&#xff0c;其带货能力不容小觑。然而&#xff0c;在选择抖音带货服务商时&#xff0c;很多商家会面临困惑&#xff1a;成都瀚网科技有限…

易基因:MeRIP-seq+ChIP-seq等揭示m6A甲基化在休眠期转录休眠调控中的潜在功能 | 发育研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 发育通常被认为是遗传程序的顺序展开&#xff0c;复杂程度不断提高&#xff0c;并按固定轨迹随时间进行。然而&#xff0c;调整发育时间可以提高在不利条件下的存活率。在哺乳动物中&…

Istio学习笔记-部署模型

参考&#xff1a;Istioldie 1.18 / 部署模型 当您将 Istio 用于生产环境部署时&#xff0c;需要确定一系列的问题。 网格将被限制在单个集群中还是分布在多个集群中&#xff1f; 是将所有服务都放置在单个完全连接的网络中&#xff0c;还是需要网关来跨多个网络连接服务&#…

开源会议通知H5页面邀请函制作源码系统+自动翻页 带完整的搭建教程

现如今&#xff0c;线上活动越来越频繁&#xff0c;而会议邀请函也成为了活动组织者不可或缺的工具。然而&#xff0c;传统的邮件、短信等方式发送邀请函已经无法满足现代人的需求。因此&#xff0c;开发一款现代化的、功能丰富的会议邀请函系统势在必行。下面源码小编将来给大…

检索搜索信息能力

&#xff08;一&#xff09;搜索工具的选择 谷歌 > 微信搜一搜 > 抖音等短视频 > 百度 &#xff08;二&#xff09;搜索方式 一&#xff0c;搜索内容的分类 信息类学习类工具类 二&#xff0c;谷歌浏览器的搜索技巧 1、“搜索内容” 限定完整出现的词 如下图搜…

酒店数据抓取

好的&#xff0c;以下是使用Haskell编写的一个简单的网页爬虫程序&#xff0c;用于抓取Booking.com和云地接酒店数据的示例。这个程序使用HTTP代理&#xff0c;代理信息为proxy_host: jshk.com.cn。 import Network.HTTP import Network.HTTP代理 import Network.URImain :: I…

二蛋赠书八期:《Java物联网、人工智能和区块链编程实战》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

【uniapp】确认弹出框,选择确定和取消

代码如下&#xff1a; <view style"display: flex; justify-content: space-around;"><button class"button" click"submit">t提交</button> </view>submit(){let thatthisuni.showModal({title: 提示&#xff1a;,con…

Shell脚本 CPU,内存,磁盘占用率检测

CPU&#xff1a;运算资源占用 内存&#xff1a;RAM类介质 磁盘&#xff1a;ROM类介质 一、CPU #!/bin/bash# 设置阈值&#xff0c;当CPU占用超过该阈值时进行输出提示 threshold80while true do# 使用top命令获取CPU占用信息&#xff0c;并使用grep和awk筛选和解析输出结果…

8、数据结构-字符串、编码集

编码表 中文编码表 ​ 数字到中文单一字符的映射&#xff0c;汉字只能使用多字节的2字节&#xff0c;总有65535种状态。常见的中文编码有GB2312 、GBK 、GB18030 、BIG 5。 ​ 所有编码表都兼容单字节的ASCII表。 UNICODE ​ 多字节&#xff0c;一张编码表解决全球多数字符…

02-学成在线内容管理模块基础环境搭建

内容管理模块 需求分析 需求分析就是要搞清楚问题域即用户的需求&#xff0c;从而确定软件要为用户解决什么问题&#xff0c;实现哪些业务功能&#xff0c;满足什么样的性能要求 首先确认用户需求: 产品人员根据用户需求会绘制界面原型&#xff0c;通过界面原型再和用户确认…

【QT系列教程】之一安装配置

文章目录 一、qt简介二、qt下载2.1、官网地址&#xff1a;https://www.qt.io/2.2、下载2.3、https://download.qt.io/official_releases/online_installers/ 三、qt安装3.1、登录账号&#xff0c;没有账号自己注册3.2、我是个人安装&#xff0c;如果是公司填写公司名字3.3、欢迎…

语聚AI助力微信客服系统与企业知识库的API连接,提升电商平台用户运营效果

建立连接&#xff1a;语聚AI与微信客服系统的API集成 在现代电商运营中&#xff0c;智能客服系统已经成为一种必备的工具。而在这方面&#xff0c;微信客服系统因其广泛的用户基础和便捷的操作方式&#xff0c;成为了业界广泛采用的工具。但是&#xff0c;为了更好地满足用户需…

SA实战 ·《SpringCloud Alibaba实战》第13章-服务网关:项目整合SpringCloud Gateway网关

大家好,我是冰河~~ 一不小心[SpringCloud Alibaba实战》专栏都更新到第13章了,再不上车就跟不上了,小伙伴们快跟上啊! 在《SpringCloud Alibaba实战》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于…

小黑子—springMVC:第二章 拦截器、全注解开发和异常处理机制

springMVC入门2.0 4、小黑子的springMVC拦截器4.1 Interceptor简介4.2 拦截器快速入门4.3 拦截器执行顺序4.4 拦截器执行原理 5、小黑子的springMVC全注解开发5.1 spring-mvc.xml中组件转化为注解形式5.1.1 消除spring-mvc.xml一二三 5.1.2 消除web.xml 6、小黑子的springMVC组…

【ARL灯塔搭建详细教程】

文章目录 前言一、前期准备二、安装docker及docker-compose三、安装ARL灯塔四、登录ARL灯塔 前言 ARL&#xff08;Asset Reconnaissance Lighthouse&#xff09;资产侦查灯塔旨在快速发现并整理企业外网资产并为资产构建基础数据库&#xff0c;无需登录凭证或特殊访问即可主动…

MTK Camera2 的OPEN API流程认知

MTK的设计架构 再了解Camera的open api调用之前我们&#xff0c;需要了解Camera的架构&#xff0c;这样才能提高阅读代码的效率。 代码跟读&#xff1a; 在这个图中大致介绍了OpenCamera的具体调用&#xff0c;下面我们逐步分析Camera的open调用流程。 逐步分析 一、 我们抛…

觉非科技发布【轻地图高速NOA智驾方案】|地平线,觉非科技,MobileDrive超捷生态协作实现技术落地

11月10日&#xff0c;2023世界新汽车技术合作生态展期间&#xff0c;觉非科技正式发布了基于地平线征程系列以及MobileDrive超捷规控系统的【轻地图高速NOA智驾解决方案】。该方案首次实现了从芯片能力输出、到数据闭环建设、再到规控部署的产业生态链协作与打通&#xff0c;为…

使用gitflow时如何合并hotfix

前言 在使用 git flow 流程时, 对于项目型的部署项目经常会遇到一个问题, 就是现场项目在使用历史版本时发现的一些问题需要修复, 但升级可能会有很大的风险或客户不愿意升级, 这时就要求基于历史版本进行 hotfix 修复. 基于历史发布版本的缺陷修复方式不同于最新发布版本的补…