MVC模式和MVVM模式
目录
一、MVC模式和MVVM模式
1. MVC模式
2. MVVM 模式
3.在Qt中的应用示例
4.总结
二、MVC与MVVM模式的共同点和区别
1.共同点
2.区别
3.交互流程
4.总结
MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)是两种常见的软件设计模式,主要用于将用户界面(UI)与业务逻辑和数据分离,以提高代码的可维护性和可扩展性。
一、MVC模式和MVVM模式
1. MVC模式
核心思想:将应用程序分为三个核心组件,职责分离。
-
Model:管理数据和业务逻辑(如数据库操作、数据计算)。
-
View:负责界面显示,不处理业务逻辑。
-
Controller:接收用户输入(如按钮点击),协调 Model 和 View 的交互。
工作流程:
-
用户通过 View 触发事件(如点击按钮)。
-
Controller 接收事件,调用 Model 修改数据。
-
Model 更新数据后,通知 View 刷新界面(通过观察者模式或直接调用)。
- 优点:职责清晰,适合复杂交互的应用。
- 缺点:View 和 Controller 可能耦合较紧,难以独立测试。
2. MVVM 模式
核心思想:通过数据绑定实现 View 和 Model 的自动同步。
-
Model:同 MVC,管理数据。
-
View:负责界面显示,声明式定义 UI(如 QML)。
-
ViewModel:暴露数据属性和命令,作为 View 和 Model 的桥梁,处理业务逻辑。
工作流程:
-
View 通过数据绑定(如 QML 的
property binding)直接关联 ViewModel 的属性。 -
用户操作 View(如输入文本)自动更新 ViewModel。
-
ViewModel 修改 Model,Model 变化后通过通知机制(如信号)更新 ViewModel,再同步到 View。
- 优点:View 和 ViewModel 解耦,适合数据驱动型 UI。
- 缺点:数据绑定可能增加调试复杂度。
3.在Qt中的应用示例
示例1:Qt 中的MVC(使用QWidgets)
-
场景:文件浏览器(显示文件夹结构)。
-
代码结构:
// Model: QFileSystemModel 提供文件系统数据 QFileSystemModel *model = new QFileSystemModel; model->setRootPath(QDir::homePath());// View: QTreeView 和 QListView 显示数据 QTreeView *treeView = new QTreeView; treeView->setModel(model); QListView *listView = new QListView; listView->setModel(model);// Controller: 自定义逻辑(例如双击文件打开) QObject::connect(treeView, &QTreeView::doubleClicked, [](const QModelIndex &index) {QString path = model->filePath(index);QDesktopServices::openUrl(QUrl::fromLocalFile(path)); }); -
说明:
-
Qt 的
Model/View框架已内置 MVC 支持,但 Controller 通常由 View 的事件处理(如信号槽)实现。
-
示例2:Qt中的MVVM(使用QML + C++)
-
场景:用户信息表单(输入姓名,实时显示欢迎语)。
-
代码结构:
// View: main.qml TextField {text: viewModel.userName // 绑定 ViewModel 属性onTextChanged: viewModel.setUserName(text) } Text {text: "Hello, " + viewModel.userName // 自动更新 }// ViewModel: UserViewModel 类(继承 QObject) class UserViewModel : public QObject {Q_OBJECTQ_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged) public:QString userName() const { return m_name; }void setUserName(const QString &name) {if (m_name != name) {m_name = name;emit userNameChanged();// 可选:更新 Model(如保存到数据库)}} signals:void userNameChanged(); private:QString m_name; };// 在 C++ 中暴露 ViewModel 到 QML UserViewModel viewModel; QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("viewModel", &viewModel); -
说明:
-
QML 的
property binding实现自动同步,ViewModel 通过Q_PROPERTY暴露数据。
-
4.总结
-
MVC:适合传统 QWidgets 应用,需手动连接信号槽(Controller 逻辑分散)。
-
MVVM:适合 QML 应用,利用数据绑定简化代码,ViewModel 集中管理状态。
-
Qt 特点:
-
Qt 的
Model/View框架(如QTableView + QSqlTableModel)是 MVC 的简化版。 -
MVVM 在 QML 中更自然,因为数据绑定是 QML 的核心特性。
-
二、MVC与MVVM模式的共同点和区别
1.共同点
- 关注点分离
- 均将应用程序分为数据层(Model)、界面层(View)和逻辑层(Controller 或 ViewModel),实现职责解耦。
- 数据与界面分离
- Model 独立管理数据逻辑,不依赖具体界面实现。
- 用户输入处理
- 均需处理用户交互(如点击、输入),并更新数据和界面。
- 同步机制
- 需要确保数据变化后界面及时更新(MVC 通过观察者模式,MVVM 通过数据绑定)。
2.区别
| 特性 | MVC | MVVM |
|---|---|---|
| 核心组件 | Model、View、Controller | Model、View、ViewModel |
| 数据流方向 | 单向:用户操作 → Controller → Model → View | 双向:View ↔ ViewModel ↔ Model(自动同步) |
| 界面更新方式 | 手动更新(需显式调用 View 刷新逻辑) | 自动更新(通过数据绑定) |
| 适用场景 | 复杂交互控制(如桌面应用) | 数据驱动型 UI(如动态表单、实时仪表盘) |
| 耦合度 | View 和 Controller 可能耦合较紧 | View 和 ViewModel 完全解耦 |
| 典型框架 | Qt Widgets、Spring MVC | Qt QML、WPF、Vue.js |
3.交互流程
1. MVC模式交互流程:
-
用户操作触发 View 的事件(如点击按钮)。
-
Controller 接收事件,调用 Model 修改数据。
-
Model 更新后通知 View 刷新界面(通过观察者模式或直接调用)。
2. MVVM交互流程:
-
View 通过数据绑定直接关联 ViewModel 的属性(如 QML 的
text: viewModel.name)。 -
用户修改 View(如输入文本),自动更新 ViewModel。
-
ViewModel 修改 Model,Model 变化后通过信号通知 ViewModel,触发 View 自动更新。
4.总结
-
选择 MVC:
适合需要精细控制交互逻辑的桌面应用(如复杂表单验证、多窗口管理)。 -
选择 MVVM:
适合数据驱动且界面频繁更新的场景(如实时监控、动态仪表盘)。 -
Qt 的灵活性:
-
在 QWidgets 中,MVC 更常见,但需手动管理数据流。
-
在 QML 中,MVVM 是自然选择,利用其声明式语法和数据绑定特性。
-
相关文章:
MVC模式和MVVM模式
目录 一、MVC模式和MVVM模式 1. MVC模式 2. MVVM 模式 3.在Qt中的应用示例 4.总结 二、MVC与MVVM模式的共同点和区别 1.共同点 2.区别 3.交互流程 4.总结 MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)是两种…...
Macos机器hosts文件便捷修改工具——SwitchHosts
文章目录 SwitchHosts软件下载地址操作添加方案切换方案管理方案快捷键 检测 SwitchHosts SwitchHosts 是一款 Mac 平台上的免费软件,它可以方便地管理和切换 hosts 文件,支持多种 hosts 文件格式。 软件下载地址 SwitchHosts 操作 添加方案 添加 …...
mysqld_exporter的搭建
1、创建/data/apps目录,并且下载mysql_exporte mkdir -p /data/apps cd /data/apps wget https://githubfast.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz 或者 wget https://github.com/promethe…...
CentOS上安装WordPress
在CentOS上安装WordPress是一个相对直接的过程,可以通过多种方法完成,包括使用LAMP(Linux, Apache, MySQL, PHP)栈或使用更现代的LEMP(Linux, Nginx, MySQL, PHP)栈。 我选择的是(Linux, Nginx…...
【数据结构】 栈和队列
在计算机科学的世界里,数据结构是构建高效算法的基础。栈(Stack)和队列(Queue)作为两种基本且重要的数据结构,在软件开发、算法设计等众多领域都有着广泛的应用。今天,我们就来深入探讨一下栈和…...
微服务限流策略与性能优化全解析
一、服务瓶颈评估实例 1.1 背景介绍 本文我用我工作中实际的一个电商营销中台系统的订单服务来阐述。此微服务数据库采用 MySQL,配置为 8 核 32G。订单服务部署于一组服务器集群,考虑到高可用性,至少配置 3 个节点,每个节点服务…...
Windows环境搭建ES集群
搭建步骤 下载安装包 下载链接:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.27-windows-x86_64.zip 解压 解压并复制出3份 es-node1配置 config/elasticsearch.yml cluster.name: xixi-es-win node.name: node-1 path.data: D:\\wor…...
qt中实现QListWidget列表
FR:徐海涛(hunkxu)...
大模型参数规模解析:32B中的“B“代表什么?如何影响AI性能?
以下是优化后的技术笔记整理,包含关键知识点解析和行业应用案例: 大模型参数规模解析:32B中的"B"代表什么?如何影响AI性能? 一、参数单位解读 B Billion(十亿):在AI模…...
Docker+Ollama+WebUI+AnythingLLM,构建企业本地AI大模型
文章目录 概要Ollama部署WebUI部署AnythingLLM部署Docker-Compose部署管理所有容器小结参考文章 概要 Ollama 是一个强大的大模型提供者,它通过开源的方式,为开发者和企业提供了先进的大型语言模型(LLM)。这些模型拥有处理和生成…...
【大模型】DeepSeek 高级提示词技巧使用详解
目录 一、前言 二、DeepSeek 通用提示词技巧 2.1 DeepSeek 通用提示词技巧总结 三、DeepSeek 进阶使用技巧 3.1 DeepSeek一个特定角色的人设 3.1.1 为DeepSeek设置角色操作案例一 3.1.2 为DeepSeek设置角色操作案例二 3.2 DeepSeek开放人设升级 3.2.1 特殊的人设&#…...
【玩转全栈】----Django基本配置和介绍
目录 Django基本介绍: Django基本配置: 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍: Django是一个开源的、基于Python的高级Web框架,旨在以快速、简洁的方式构建高质量的We…...
[Unity角色控制专题] (借助ai)详细解析官方第三人称控制器
首先模板链接在这里,你可以直接下载并导入unity即可查看官方为开发者写好一套控制器 本文的ai工具用到了豆包,其灵活程度很高,总结能力也强过我太多 因此大量使用,不喜勿喷 Starter Assets - ThirdPerson | Updates in new Charac…...
安装 Docker Desktop 修改默认安装目录到指定目录
Docker Desktop安装目录设置 Docker Desktop 默认安装位置 (C:\Program Files\Docker\Docker) 是这个 ,导致系统盘占用过大,大概2G ; 那么如何安装到其他磁盘呢? 根据docker desktop 官网 Docker Desktop install 我们可以看到&a…...
渗透测试--文件包含漏洞
文件包含漏洞 前言 《Web安全实战》系列集合了WEB类常见的各种漏洞,笔者根据自己在Web安全领域中学习和工作的经验,对漏洞原理和漏洞利用面进行了总结分析,致力于漏洞准确性、丰富性,希望对WEB安全工作者、WEB安全学习者能有所帮助…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十一节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(RequestTransferExit0x37服务) 作者:车端域控测试工程师 更新日期:2025年02月13日 关键词:UDS协议、0x37服务、传输终止、NRC验证、ISO 14229-1:2023 一、服务功能概述 0…...
虚拟环境测试部署应用
一、作用 虚拟环境(env)在计算机领域,特别是在软件开发和测试中扮演着重要角色。它主要用于创建一个隔离的环境,使得开发者可以在不影响系统其余部分的情况下安装、配置和运行软件项目。以下是虚拟环境的一些主要作用: 1、依赖管理 不同的项目可能需要不同版本的库或框…...
【线性代数】2矩阵
1.矩阵的运算 1.1.定义 矩阵行列式数表数行数和列数可以不相等行数和列数必须相等1.2.加法与数乘 矩阵的数乘:所有元素都乘这个数 矩阵的加法:对应位置处元素相加 🦊已知,求 1.3.乘法 矩阵乘法三步法 ①能不能乘:内定乘 ②乘完是何类型:外定型 ③中的元素是什么:左…...
前端为什么要使用new Promise包裹一个函数
在前端开发中,使用 new Promise 包裹一个函数主要是为了将原本不支持 Promise 规范的操作转化为支持 Promise 规范的操作,从而可以更好地处理异步操作,提升代码的可读性和可维护性。下面详细介绍这么做的常见原因和应用场景: 1. …...
深度学习在天文观测中的应用:解锁宇宙的奥秘
深度学习在天文观测中的应用:解锁宇宙的奥秘 引言 宇宙是无尽的,天文学家通过观测天体来揭示宇宙的奥秘。随着现代天文设备技术的进步,我们现在可以通过 射电望远镜、空间望远镜 和 地面望远镜 获取大量的天文数据。然而,这些数据的规模和复杂性让传统的手工分析方法变得…...
SaaS 平台开发要点
如何在 SaaS 平台的前端开发中,编写高性能、高质量且高度通用化的 Vue 组件 一、组件设计原则 单一职责原则:每个组件只负责一个核心功能受控/非受控模式:同时支持 v-model 和自主状态管理组合式 API:使用 Composition API 提升逻辑复用性可访问性:遵循 WAI-ARIA 规范Typ…...
python从入门到进去
python从入门到进去 第一章、软件和工具的安装一、安装 python 解释器二、安装 pycharm 第二章、初识 python一、注释可分三种二、打印输入语句三、变量1、基本数据类型1.1、整数数据类型 int1.2、浮点数数据类型 float1.3、布尔数据类型 boolean1.4、字符串数据类型 string 2、…...
DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析
一、引言 1.1 研究背景与意义 在医疗信息化快速发展的当下,电子病历系统已成为医院信息管理的核心构成。电子病历(EMR)系统,是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图标、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的…...
苍穹外卖day4 redis相关简单知识 店铺营业状态设置
内存存储 键值对 key-value 一般用于处理突发性大量请求数据操作(暂时浅显理解) 读写速度极快,常用于缓存数据,减少对数据库的访问压力,提高系统性能。例如,可以缓存用户会话、商品信息、页面数据 设置默…...
pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网
首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话,那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm:适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…...
使用新版本golang项目中goyacc依赖问题的处理
背景 最近项目使用中有用到go mod 和 goyacc工具。goyacc涉及到编译原理的词法分析,文法分析等功能,可以用来生成基于golang的语法分析文件。本期是记录一个使用中遇到的依赖相关的问题。因为用到goyacc,需要生成goyacc的可执行文件。 而项目…...
Moya 网络框架
Moya 网络框架 通过 Moya 进行网络请求的一般步骤如下: 1. 定义 TargetType:为每个 API 请求创建一个枚举,遵循 TargetType 协议,指定基础 URL、请求路径、方法、参数等。 2. 创建 MoyaProvider:实例化 MoyaProvider&…...
FreeRTOS第3篇:链表的“精密齿轮”——列表与列表项
文章目录 1 列表与列表项:FreeRTOS的“排队系统”2 列表操作:FreeRTOS的“排队算法”3 列表的应用场景:FreeRTOS的“任务调度枢纽”4 源码级洞察:列表的“灵魂代码”5 实战:列表操作实验6 总结与思考引言:嵌入式系统的“任务候车厅” 想象你正在管理一座繁忙的火车站:乘…...
React.memo 使用详解与最佳实践
React.memo 使用详解与最佳实践 引言React.memo 是什么?使用场景实战示例示例解析自定义比较函数使用注意事项总结 引言 在 React 应用程序中,性能优化是一个永恒的话题。当父组件状态发生变化时,即使子组件的 props 没有改变,子…...
SpringBoot中集成SaToken
SpringBoot中集成SaToken 1. 写一个拦截器2. 对拦截器的说明&解释2. 拦截器 1. 写一个拦截器 import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import org.springframework.beans.factory.annotation.Value; import org.spri…...
