一、什么是 mvvm? MVC、MVP、MVVM三种模式的区别与详解

news2024/11/15 12:52:57

简介

MVC、MVP、MVVM都是常见的软件架构模式。

MVC(Model-View-Controller)架构模式中,将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。Controller负责处理用户交互和调度业务逻辑,View负责显示数据,Model负责数据的存储和逻辑处理。

MVP(Model-View-Presenter)架构模式,类似于MVC,但将View和Model的交互逻辑抽象到了Presenter中。在MVP中,View负责展示数据和接收用户输入,Presenter负责处理用户输入并更新View和Model。

MVVM模式(Model-View-ViewModel)架构模式,是将View和ViewModel关联起来,通过双向数据绑定实现View和ViewModel的同步更新。View负责展示数据和用户交互,ViewModel负责处理数据和业务逻辑,Model负责存储数据。MVVM的优点是能够降低View和ViewModel之间的耦合,使得代码更加可维护和可测试。

MVC详解

MVC架构模式认为,软件架构应该由三部分组成,模型(Model)、视图(View)和控制器(Controller)。
组件:
1.Model(模型):负责数据的处理和业务逻辑。可以理解为数据库存储和业务层处理。

2.View(视图):负责展示数据给用户,并处理用户的输入。可以理解为用户可以看的到和操作的页面。

3.Controller(控制器):负责协调模型和视图之间的交互,处理用户的输入并更新模型和视图。

MVC模式的核心思想是将应用程序分为三个独立的部分,使得每个部分可以独立开发、测试和维护。

这3种组件通过交互来协作:View创建Controller后, Controller根据用户交互调用Model的相应服务,而Model会将自身的改变通知View,View则会读取Model的信息以更新自身。
在这里插入图片描述
MVC架构的优点在于模型和视图的分离,提高了代码的可维护性和可测试性,用Controller作为中介,实现了模型和视图之间的解耦。但缺点是视图和控制器之间的交互复杂,增加了开发的复杂度。

MVP详解

MVP模式类似MVC模式,它通过Presenter作为中介来协调Model和View之间的交互。实现视图和模型的解耦,视图通过接口与Presenter进行交互,Presenter将视图的事件传递给模型进行处理,并将处理结果返回给视图进行展示。
组件

1.Model(模型):负责数据的处理和业务逻辑。

2.View(视图):负责展示数据给用户,并处理用户的输入。

3.Presenter(Presenter):负责协调模型和视图之间的交互,处理用户的输入并更新模型和视图。
在这里插入图片描述
它的优点也是在于可以把视图和模型的解耦,方便进行单元测试,同时,Presenter作为中介,将视图和模型之间的交互逻辑集中处理,可以支持多个视图对应一个Presenter的情况,但缺点在于Presenter可能会变得臃肿,难以管理。视图和Presenter之间的交互仍然较为复杂。

到这里大家可能会问,那MVC和MVP的不同点在哪?
从架构图和组件直接的交换可以看出,不同点:

MVP模式:
1.View不直接与Model交互,而是通过与Presenter交互来与Model间接交互
2.Presenter与View的交互是通过接口来进行的,更有利于添加单元测试
3.通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑,业务相似的时候也可以多同个View共享一个Presenter。
MVC模式:
1.View可以与Model直接交互
2.Controller是基于行为的,并且可以被多个View共享
3.Controller可以负责决定显示哪个View

而它们的相同点有:
优点:
1.降低耦合度
2.模块职责划分明显
3.利于测试驱动开发
4.代码复用
5.隐藏数据
6.代码灵活性
缺点:
额外的代码复杂度及学习成本。

MVVM 详解

MVVM模式通过数据绑定机制将ViewModel中的数据直接绑定到视图上,实现了视图和数据的自动同步。Vue中就使用了这种模式进行数据的双向绑定。
组件

1.Model(模型):负责数据的处理和业务逻辑。

2.View(视图):负责展示数据给用户,并处理用户的输入。

3.ViewModel(视图模型):负责将模型中的数据转换为视图可以直接使用的形式,并监听视图的变化来更新模型的数据。
在这里插入图片描述
它的优点在于实现视图和模型的解耦,方便进行单元测试,同时数据绑定机制简化了视图和模型之间的交互逻辑,ViewModel可以通过命令模式实现对用户输入的响应。缺点在于,数据绑定可能导致性能问题,需要谨慎使用。

MVC、MVP、MVVM的比较

从应用场景方面看:

MVC通常用于Web应用程序、桌面应用程序等。

MVP通常用于桌面应用程序、移动应用程序等。

MVVM通常用于前端开发、移动应用程序等。

从应用的优劣上看:

MVC相对简单,适用于小型应用程序,但控制器可能变得臃肿。

MVP在MVC的基础上进一步解耦了视图和模型,但Presenter可能变得臃肿。

MVVM通过数据绑定机制简化了视图和模型之间的交互,但可能导致性能问题。

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

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

相关文章

VBA技术资料MF185:图片导入Word添加不同格式说明文字

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

Nuclei文件上传小Tips

前言 Nuclei对于文件上传类型Poc编写小Tips 平台 ProjectDiscovery Cloud Platform: https://cloud.projectdiscovery.io/ JsonPath: https://jsonpath.com/ Json解析: 在线json解析平台即可 案例 某康resourceOperations upload接口存在前台上传 具体接口&…

海康VisionMaster使用学习笔记9-畸变标定和畸变校正的使用

畸变标定和畸变校正 1. 功能和分类 2. 畸变标定 添加图像源 加载带有畸变的标定板图像 标定时标定板图像需尽量占满视野. 添加畸变标定 用于生成畸变标定文件 1. 运行参数畸变类型: 此时标定板图像同时包含径向和透视,因此选择径向透视畸变.标定板类型:棋盘格标定板校正中…

三、LogicFlow 基础配置介绍及实现一个基础 Demo

目录 前置LogicFlow 介绍LogicFlow基础配置引入方式核心包基础概念实例(配置项)节点边(节点与节点之间的连线)背景网格主题事件 插件包 实现基础Demo最后 前置 这一篇主要是对 LogicFlow 的一些功能及配置相关的介绍(…

C++竞赛初阶L1-13-第五单元-循环嵌套(29~30课)535: T456454 数字统计

题目内容 请统计某个给定范围 [L,R] 的所有整数中,数字 2 出现的次数。 比如给定范围 [2,22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出现 1 次,在数 21 中出现 1 次,在数 22 中出现…

人工智能赋能的认知营销:定制开发AI智能名片商城小程序的未来展望

摘要:随着人工智能技术的飞速发展,其在商业领域的应用日益广泛且深入,特别是在认知营销这一前沿领域。本文旨在探讨人工智能如何通过定制开发AI智能名片商城小程序,为认知营销注入新的活力与可能性。通过深入分析人工智能在数据处…

Security OAuth2简单修改授权码方式

问题 用户先通过密码模式获取令牌(前端携带用户名和密码,在网关添加客户端id和客户端密码参数,认证服务通过密码模式发放令牌),此后使用该令牌访问服务。 现在,需要该用户授权给第三方客户端访问这个用户…

k8s 进阶实战笔记 | Ingress-traefik(一)

文章目录 traefik认知基本概述基础特性其他ingress对比核心概念和能力 安装部署创建CRD资源RBAC资源创建配置文件部署traefik预期效果 traefik认知 基本概述 ● 官网:https://traefik.cn ● 现代HTTP反向代理、负载均衡工具 ● 它支持多种后台 (Docker, Swarm, Ku…

ElasticSearch IK分词器的MySQL热部署字典(Docker)

1.下载插件源码 找到自己对应ES版本的下载 Releases infinilabs/analysis-ik GitHub 2.添加mysql驱动依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version><…

thinkphp5实现弹出框(下拉框选项动态赋值)

效果图 原理 先执行接口获取动态数据&#xff0c;然后在 layer.open的success回调函数中动态添加html代码片段&#xff0c;通过如下方法&#xff0c;将动态生成的代码插入指定的div中&#xff0c;实现动态赋值的效果。 // 动态获取的数据 var data ......;// 弹出框配置 lay…

Win10关闭弹出提示-‘密码已过期需要更换’

运行—>lusrmgr.msc—>本地用户和组—>用户—>右侧要设置的用户名—>属性—>勾选‘密码永不过期’

laravel使用SSH 隧道连接远程数据库

1、创建SSH隧道 // An highlighted blockssh -i ./id_rsa -N -L 3306:localhost:3306 -p 8848 root192.161.1.1对上述代码的 解释。 命令是一个SSH隧道命令&#xff0c;用于将本地端口3306转发到远程服务器上的3306端口。以下是命令的详细解释&#xff1a;ssh: 调用SSH客户端…

AI工作流:低代码时代的革新者,重塑手机问答类应用生态

在这个数字化迅猛发展的时代&#xff0c;低代码技术正以惊人的速度改变着我们的生活方式。作为低代码人群的先锋&#xff0c;AI工作流技术正在以前所未有的方式&#xff0c;赋予非技术人群实现梦想的能力 &#x1f525;能用AI-低代码传送门&#xff1a;https://www.nyai.chat …

【运维】从一个git库迁移到另一个库

工作目录&#xff1a; /home/java/hosts 10.60.100.194 脚本 hosts / hostsShell GitLab (gbcom.com.cn) 核心代码

AOP实现日志记录需求

首先创建annotation包,包下创建SystemLog类 Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) public interface SystemLog {String businessName(); }创建aspect包&#xff0c;包下创建LogAspect类 Component Aspect Slf4j public class LogAspect {Pointc…

给RAG系统做一次全面「体检」,亚马逊开源RAGChecker诊断工具

亚马逊上海人工智能研究院成立于 2018 年&#xff0c;已成为深度学习研究领域的领先机构之一&#xff0c;共发表了&#xff5e;90 篇论文。研究领域包括深度学习的基础理论、自然语言处理、计算机视觉、图机器学习、高性能计算、智能推荐系统、欺诈检测与风险控制、知识图谱构建…

【Redis分析】(一) 主从同步

主从复制 - 数据备份, 读写分离, 手动高可用 负载均衡: 主结点只负责处理写请求, 从节点负责读请求;主从复制, 主机挂了, 我们可以手动切换从机, 还可以搭配哨兵实现自动切换, 实现高可用;需要注意的是, 在主从模式下, 假设进行同步的过程中主节点宕机了, 那么从节点此时还没有…

Ubuntu | 右上角网络图标消失,有线网络在设置中消失,虚拟机没网

目录 第一步&#xff1a;删除 NetworkManager 缓存文件第二步&#xff1a;修改 /etc/NetworkManager/NetworkManager.conf第三步&#xff1a;重启 NetworkManager第四步&#xff1a;右上角网络图标出现 参考博客&#xff1a;虚拟机没网&#xff0c;重启网络服务&#xff1a;Fai…

手机操作技巧:如何进入锁定的Android手机

被锁定在您的 Android 手机之外可能是一种令人沮丧的经历&#xff0c;尤其是当您存储了重要文件和数据时。幸运的是&#xff0c;您可以尝试几种方法来重新获得对手机的访问权限。在这篇博文中&#xff0c;我们将探讨可用于解锁锁定的 Android 手机的各种技术和工具。我们还将提…

80.游戏的分辨率修改思路与分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;79.游戏分析工具闪屏问题优化与数据被修改高亮 GAMEHACKER2.exe 工具下载地址&#xff…