MVC、MVP和MVVM之间的区别
MVC(Model-View-Controller)隔开业务和UI(一对一)
- 角色划分:
Model:负责处理数据和业务逻辑,通常包括数据的存储、检索和更新等操作。
View:负责展示用户界面,接收用户输入,并将用户操作传递给 Controller。
Controller:作为 Model 和 View 之间的中介,负责处理用户输入,调用 Model 进行数据处理,并更新 View 以反映数据的变化。 - 交互方式:
View 和 Model 之间存在直接的依赖关系。View 可以直接访问 Model 中的数据,并且在数据发生变化时,View 需要主动从 Model 中获取新的数据进行更新。
Controller 负责协调 View 和 Model 之间的交互。当用户在 View 上进行操作时,View 将事件传递给 Controller,Controller 再根据事件类型调用 Model 进行相应的业务处理,并更新 View。 - 优缺点:
优点:
结构简单,易于理解和实现。
可以将业务逻辑和用户界面分离,提高代码的可维护性。
缺点:
View 和 Model 之间的紧密耦合可能导致代码难以维护和测试。例如,当 Model 中的数据发生变化时,View 需要主动获取数据并更新自己,这增加了代码的复杂性。
Controller 可能会变得过于庞大和复杂,因为它需要处理所有的用户输入和业务逻辑。
- 主动式
- 被动式
MVP(Model-View-Presenter)
- 角色划分:
Model:与 MVC 中的 Model 类似,负责处理数据和业务逻辑。
View:只负责显示数据和接收用户输入,不包含任何业务逻辑。View 通常通过接口与 Presenter 进行交互。
定义接口,如UserListView,包含显示用户列表、显示加载进度、显示错误信息等方法。
Presenter:作为 View 和 Model 之间的中介,负责处理用户输入,调用 Model 进行数据处理,并更新 View。Presenter 通常包含大部分的业务逻辑。
实现UserListView接口中的方法,负责处理用户输入,调用 Model 进行数据处理,然后更新 View。 - 交互方式:
View 和 Model 之间完全解耦,通过 Presenter 进行间接交互。View 只需要将用户操作传递给 Presenter,Presenter 负责调用 Model 进行数据处理,并将结果返回给 View 进行显示。
Presenter 与 View 和 Model 都有联系。Presenter 接收来自 View 的用户输入,调用 Model 进行业务处理,并将结果更新到 View。同时,Presenter 也可以从 Model 中获取数据,并将其传递给 View 进行显示。 - 优缺点:
优点:
更好地实现了 View 和 Model 的解耦,使得代码更易于维护和测试。
Presenter 可以进行单元测试,而不需要依赖于 Android 框架,提高了测试的效率和可靠性。
缺点:
代码量相对较大,因为需要定义接口来实现 View 和 Presenter 之间的交互。
Presenter 可能会变得复杂,特别是当业务逻辑较多时。
MVVM(Model-View-ViewModel)
- 角色划分:
Model:与 MVC 和 MVP 中的 Model 类似,负责处理数据和业务逻辑。
View:负责显示数据和接收用户输入,不包含任何业务逻辑。View 通过数据绑定与 ViewModel 进行交互。
ViewModel:作为 View 和 Model 之间的桥梁,负责处理业务逻辑,并将数据以可观察的方式提供给 View。ViewModel 通常包含大部分的业务逻辑和数据处理代码。 - 交互方式:
View 和 Model 之间通过 ViewModel 进行间接交互。View 通过数据绑定机制自动更新显示的数据,而不需要手动从 ViewModel 中获取数据。当用户在 View 上进行操作时,View 将事件传递给 ViewModel,ViewModel 进行相应的业务处理,并更新数据,从而自动更新 View。
ViewModel 与 Model 进行交互,获取数据并进行处理,然后将处理后的数据以可观察的方式提供给 View。View 只需要关注数据的变化,而不需要关心数据的来源和处理过程。 - 优缺点:
优点:
实现了更好的 View 和 Model 的解耦,代码结构更加清晰,易于维护和测试。
数据绑定机制使得 View 的更新更加自动和高效,减少了手动更新 View 的代码量。
ViewModel 可以进行单元测试,而不需要依赖于 Android 框架。
缺点:
学习成本相对较高,需要掌握数据绑定等新的技术和概念。
对于复杂的界面和业务逻辑,ViewModel 可能会变得复杂,需要合理地组织代码。
相关文章:

MVC、MVP和MVVM之间的区别
MVC(Model-View-Controller)隔开业务和UI(一对一) 角色划分: Model:负责处理数据和业务逻辑,通常包括数据的存储、检索和更新等操作。 View:负责展示用户界面,接收用户输…...

uni-app 打包成app时 限制web-view大小
今天对接一个uni-app的app 内置对方h5 web-view的形式 需要对方在web-view顶部加点东西 对方打的app的web-view始终是全屏的状态,对方表示做不到我要的效果 emmmmmm。。。。。。 于是乎 自己搭了个demo 本地h5跑起来审查了下代码,发现web-view是给绝对定位了 于是乎 我想外层…...

智能指针(2)
目录 答题格式: 几个易错点 可能问法四: 问题分析: 问题解答: 上回文说到,weak_ptr的功能和区别,并且进行了分析,我们接着进行解答。 答题格式: int main() { std::we…...

[含文档+PPT+源码等]精品基于Nodejs实现的家教服务小程序的设计与实现
基于Node.js实现的家教服务小程序的设计与实现背景,主要源于以下几个方面: 一、家教市场的现状与需求 随着教育竞争的日益激烈,家庭对子女教育质量的重视程度不断提升,家教服务已成为许多家庭不可或缺的一部分。然而,…...

electron打包报错-winCodeSign无法下载
electron打包报错-winCodeSign下载问题 问题描述 downloaded urlhttps://registry.npmmirror.com/-/binary/electron-builder-binaries/winCodeSign-2.6.0/winCodeSign-2.6.0.7z duration1.577s⨯ cannot execute causeexit status 2outerrorOutERROR: Cannot create s…...

给Windows系统设置代理的操作方法
一、什么是代理 网络代理是一种特殊的网络服务,允许一个网络终端通过这个服务与另一个网络终端进行非直接的连接,而提供代理服务的电脑系统或其它类型的网络终端被称为代理服务器。 代理服务器是网络信息的中转站,代理服务器就像是一个很大的…...

高质量带货短视频素材来源推荐
在抖音带货时,寻找高质量视频素材至关重要。今天,我为大家分享五个可以下载高清无水印带货短视频素材的网站,帮助你轻松获取灵感和素材! 蛙学网 蛙学网作为国内领先的短视频素材平台,提供多种类的带货短视频素材。无论…...

torchvision.transforms.Resize()的用法
今天我在使用torchvision.transforms.Resize()的时候发现,一般Resize中放的是size或者是(size,size)这样的二元数。 这两个里面,torchvision.transforms.Resize((size,size)),大家都很清楚,会将图像的h和w大小都变成size。 但是…...

简单认识 redis -数据类型命令
一.Redis 键(key) 不能存在相同名称的key //SET KEY_NAME value 设置一个键 127.0.0.1:6379> set runoobkey redis OK 127.0.0.1:6379> get runoobkey redis "redis" //DEL KEY_NAME 删除键 127.0.0.1:6379> DEL redis (integer) 0 127.0.0.1:6379>…...

Python 语言学习——应用1.2 数字图像处理(第二节,变换)
目录 1.基础知识 1.图像几何变换概念 2.图像几何变换方式 3.插值运算 4.几何变换步骤 2.各类变换 1.位置变换 2.形状变换 3.代数运算 3.实战演练 1.基础知识 1.图像几何变换概念 在图像处理过程中,为了观测需要,常常需要对 图像进行几何变换&am…...

【QT Quick】页面布局:手动定位与坐标系转换
在这篇教程中,我们将详细介绍在 QT Quick 中如何手动定位元素以及坐标系转换的概念和应用。手动定位不仅仅是指定 x、y 坐标,更涉及坐标系的管理。我们会从最基本的手动定位开始,逐步扩展到更复杂的坐标系转换操作。 坐标系 默认坐标系&…...

uniapp自定义导航,全端兼容
我们在用uniapp 开发应用的时候,有的页面需要自定义导航, 1.如果普通的直接使用uni 扩展柜组件的 uni-nav-bar 也基本够用, 2.如果稍微带点自定义的这个值无法支持的,特别在小程序端,胶囊是会压住右边的按钮的 自定…...

[论文阅读] DVQA: Understanding Data Visualizations via Question Answering
原文链接:http://arxiv.org/abs/1801.08163 启发:没太读懂这篇论文,暂时能理解的就是本文提出了一个专门针对条形图问答的数据集DVQA以及一个端到端模型SANDY,模型有两个版本,Oracle和OCR。主要解决的问题是固定词表无…...

【PostgreSQL】实战篇——数据备份和恢复的最佳实践和工具
数据备份和恢复是确保数据安全性和可用性的关键环节。无论是由于硬件故障、软件错误、数据损坏还是人为错误,能够快速恢复数据都是保护业务连续性的重要措施。 PostgreSQL 提供了多种备份和恢复工具和方法,其中最常用的包括 pg_dump、pg_restore 和点时…...

代码随想录算法训练营第二十九天|93.复原IP地址 78.子集 90.子集II
93.复原IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"…...

【mysql】使用AbstractRoutingDataSource实现多数据源 与 获取mapper上注解
使用AbstractRoutingDataSource实现多数据源 与 获取mapper上注解 背景 随着业务发展速度越来越快,数据的增长也呈现倍数级别增长,数据库的压力,对于查询和写入等所有操作,都依赖于主库,其实有一些对于时效性要求不高…...

希沃冰点还原
要取消希沃冰点还原,可以按照以下步骤进行: 打开希沃冰点还原的应用或程序。 在应用或程序的界面上,寻找设置选项或菜单。 点击或选择设置选项或菜单,进入设置界面。 在设置界面上,查找“取消”或“停止”等相关选项…...

Hadoop服务端口号、Spark端口号、Hive端口号以及启动命令
文章目录 1. 服务端口号1.1 Hadoop相关的服务端口号1.2 Spark相关的服务端口号1.3 Hive的连接端口 2. 服务启动指令 1. 服务端口号 1.1 Hadoop相关的服务端口号 HDFS的web页面访问端口 9870HDFS 的程序访问端口 8020Yarn的访问端口 8088历史日志访问端口 19888 1.2 Spark相关…...

【C++】--类和对象(3)
🤑个人主页: 起名字真南 🤑个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 深入构造函数2 类型转换3 static成员4 友元函数5 内部类6 匿名对象 1 深入构造函数 之前我们实现构造函数的时候,初始化成员变量都是在函数体内赋值,…...

国外电商系统开发-运维系统文件上传-高级上传
如果您要上传文件到10台服务器中,有3台服务器的路径不是一样的,那么在这种情况下您就可以使用本功能,单独执行不一样的路径 点击【高级】上传...

【MongoDB】mongodb | 部署 | 常用命令
一、概述 基于mongodb的tcp连接无数据上报,服务器强踢监测。 物联网项目,tcp协议,基于4G卡,设备由于某些原因会断开重连,但是tcp没有断开,导致tcp持续累加,浪费资源。 建立机制: 当t…...

【Chrome浏览器插件--资源嗅探猫抓】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、资源嗅探插件---猫抓二、使用步骤总结 一、资源嗅探插件—猫抓 猫抓是一个浏览器插件,可以检测当前网页中的一些资源文件,可设置嗅探的…...

2.4Mybatis——缓存机制
2.4Mybatis——缓存机制 缓存配置一二级缓存一级缓存二级缓存 合集总览:Mybatis框架梳理 讲真,Mybatis缓存这块的记忆已经模糊了。刚好此时写测试用例出现一个BUG,就以这个问题作为切入点来梳理一下。 Testpublic void test(){Address ad…...

移动技术开发:文件的读取
1 实验名称 文件的读写 2 实验目的 掌握Android中读写文件的实现方法。 3 实验源代码 布局文件代码: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android&quo…...

Linux 中的 Makefile 伪目标详解
在 Linux 环境中,Makefile 是构建项目的重要工具,它通过定义规则,指导 make 工具如何编译和链接程序。通常我们会在 Makefile 中定义目标(target),这些目标通常对应文件名。然而,有一种特殊类型…...

Java基础(中)
变量 成员变量与局部变量的区别 语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控…...

Leetcode热题100-200 岛屿数量
Leetcode热题100-200 岛屿数量 1. 题目描述2. 代码实现1. dfs算法2. bfs算法 1. 题目描述 200 岛屿数量 2. 代码实现 1. dfs算法 class Solution { public:int numIslands(vector<vector<char>>& grid) {int m grid.size(), n grid[0].size();int res 0…...

大数据新视界 --大数据大厂之 GraphQL 在大数据查询中的创新应用:优化数据获取效率
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

swift使用代码结构解析
多模态模型的训练llamafactory也可以训练,但是总的来说,llamafactory对多模态模型的支持还是不太多,ms-swift支持的多模态模型更多,因此有时候去找框架是否够支持相应的模型时会有所困难,所以对这些框架的代码也要稍微…...

五、Python基础语法(程序的输入和输出)
一、输入 输入:输入就是获取键盘输入的数据,使用input()函数。代码会从上往下执行,当遇到input()函数,就会暂停执行,输入内容后,敲回车键,表示本次的输入结束。input函数得到的数据类型都是字符…...