一、什么是MVVM

(一)定义

MVVM是Model - View - ViewModel的缩写,它是一种软件架构设计模式,主要用于构建用户界面。这种模式将应用程序分为三个主要部分:

  1. Model(模型层)
    • 它是应用程序中负责数据管理和业务逻辑的部分。例如,在一个电商应用中,Model层可能包含商品信息(如价格、库存等)、用户信息(如用户名、密码等)以及与数据库交互的代码。Model层不直接与用户界面交互,它只关注数据的存储、获取和处理。比如,当商品价格需要根据促销活动进行调整时,Model层会负责计算新的价格,并将新的数据提供给其他部分。
  2. View(视图层)
    • 这是用户直接看到和交互的部分,也就是用户界面。它可以是网页、移动应用的界面等。View层的主要职责是展示数据和接收用户的输入。例如,在一个新闻阅读应用的View层,会显示新闻的标题、内容、图片等信息,并且有按钮让用户可以点赞、评论等。View层不直接处理数据逻辑,它只是将用户的操作(如点击按钮)通知给ViewModel层。
  3. ViewModel(视图模型层)
    • 它是连接View和Model的桥梁。ViewModel层的作用是将Model层的数据转换成View层可以显示的格式,并且将View层的用户操作转化为Model层可以理解的指令。例如,当用户在新闻阅读应用中点击“点赞”按钮时,ViewModel层会接收到这个操作,然后通知Model层去更新点赞数量。同时,当Model层的数据发生变化(如新闻内容更新)时,ViewModel层会将这些数据更新传递给View层,从而更新用户界面。

(二)工作原理

  1. 数据绑定
    • 这是MVVM模式的核心机制之一。在MVVM框架下,View层和ViewModel层之间通过数据绑定进行通信。数据绑定可以是单向的也可以是双向的。单向数据绑定通常是ViewModel到View,例如,ViewModel层从Model层获取新闻标题数据,然后通过数据绑定机制将新闻标题显示在View层的新闻标题区域。双向数据绑定则允许View层和ViewModel层的数据相互更新。例如,在一个表单应用中,用户在输入框(View层)输入内容时,ViewModel层的数据会实时更新,反之亦然。
  2. 命令绑定
    • 用于将用户的操作(如点击按钮)从View层传递到ViewModel层。例如,在一个购物应用中,用户点击“加入购物车”按钮,这个操作会通过命令绑定传递给ViewModel层,ViewModel层再根据业务逻辑(如检查库存等)处理这个操作,并且可能会通知Model层进行数据更新(如增加购物车中的商品数量)。

二、MVVM和MVC的区别

(一)架构组成

  1. MVC(Model - View - Controller)
    • MVC也是将应用程序分为三个部分:Model、View和Controller。
      • Model:和MVVM中的Model类似,负责数据和业务逻辑。
      • View:也是用户界面部分,用于展示数据和接收用户输入。
      • Controller(控制器层):在MVC中,Controller是核心部分,它接收用户从View层传来的请求,然后根据请求去操作Model层,并且将处理结果返回给View层。例如,在一个在线课程平台,当用户点击“报名课程”按钮时,Controller会接收这个请求,然后去检查Model层中的课程信息(如是否还有名额等),如果可以报名,就更新Model层的数据(如增加报名人数),最后将报名成功的信息返回给View层显示给用户。
  2. MVVM
    • 如前面所述,MVVM有Model、View和ViewModel三个部分。ViewModel在MVVM中起到了类似MVC中Controller的作用,但又有所不同。ViewModel更专注于数据绑定和视图逻辑的处理,而不是像Controller那样直接处理用户的请求。

(二)数据流

  1. MVC
    • 数据流是线性的。用户在View层发起操作,请求传递给Controller,Controller处理后更新Model或者将结果返回给View。例如,用户在博客应用中点击“发布文章”按钮,View层将请求发送给Controller,Controller获取文章内容等数据,然后更新Model层(如将文章存储到数据库),最后将发布成功的信息通过View层展示给用户。
  2. MVVM
    • 数据流主要是通过数据绑定来实现的。View层和ViewModel层之间通过数据绑定双向通信,ViewModel层和Model层之间也有数据交互。例如,在一个天气应用中,Model层从天气服务获取天气数据,然后通过ViewModel层的数据绑定机制,将天气信息(如温度、天气状况等)显示在View层。当用户切换城市时,View层通知ViewModel层,ViewModel层再通知Model层获取新城市的天气数据,然后更新View层。

(三)开发效率和复杂度

  1. MVC
    • MVC模式在一些简单的应用程序中比较容易理解和实现。例如,对于一个小型的博客网站,通过MVC模式可以快速搭建起基本的发布文章、浏览文章等功能。但是随着应用程序的复杂度增加,Controller可能会变得臃肿。因为Controller需要处理大量的用户请求和业务逻辑,当功能越来越多时,Controller代码可能会变得难以维护。
  2. MVVM
    • MVVM模式在数据绑定和视图逻辑处理方面有优势,特别是在复杂的用户界面应用中。例如,在一个具有复杂表单和动态数据更新的企业管理软件中,MVVM模式可以通过数据绑定减少大量的模板代码,使得开发者可以更专注于业务逻辑的实现。不过,MVVM的学习曲线相对较高,需要开发者理解数据绑定、命令绑定等概念,并且在一些简单的应用中可能会显得过于复杂。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringCache 提供的一套基于注解的缓存抽象机制】

Spring 缓存(Spring Cache)是 Spring 提供的一套基于注解的缓存抽象机制,常用于提升系统性能、减少重复查询数据库或接口调用。 ✅ 一、基本原理 Spring Cache 通过对方法的返回结果进行缓存,后续相同参数的调用将直接从缓存中读…

HRI-2025 | 大模型驱动的个性化可解释机器人人机交互研究

作者:Ferran Gebelli 1 ^{1} 1, Lavinia Hriscu 2 ^{2} 2, Raquel Ros 1 ^{1} 1, Sverin Lemaignan 1 ^{1} 1, Alberto Sanfeliu 2 ^{2} 2, Anais Garrell 2 ^{2} 2单位: 1 ^{1} 1PAL Robotics, 2 ^{2} 2IRI (UPC-CSIC)论文标题:P…

Gitee Wiki:重塑关键领域软件研发的知识管理范式

在数字化转型浪潮席卷全球的当下,关键领域软件研发正面临前所未有的知识管理挑战。传统文档管理模式的局限性日益凸显,知识传承的断层问题愈发严重,团队协作效率的瓶颈亟待突破。Gitee Wiki作为新一代知识管理平台,正在通过技术创…

JVM 内存溢出 详解

内存溢出 内存溢出指的是内存中某一块区域的使用量超过了允许使用的最大值,从而使用内存时因空间不足而失败,虚拟机一般会抛出指定的错误。 在Java虚拟机中,只有程序计数器不会出现内存溢出的情况,因为每个线程的程序计数器只保…

dvwa8——SQL Injection(Blind)

由题目得这一关用盲注写 LOW: 先用bp抓包一下 , 看到这low是get提交 , f12打开hackbar 输入?id1时报错 尝试闭合 , 回显正常 开始注入 1.order by 判断列数,3的时候开始回显报错,所以有两列 ?id1 order by 2--&SubmitSubmit# 2.无回显位置可以爆出,我们通过盲注来继…

探索分布式存储与通信:去中心化共享及通訊(DSAC)

在当今数字化时代,分布式系统的重要性愈发凸显。它不仅能提升数据的存储安全性和可靠性,还能增强通信的效率和隐私性。于是我做了这个去中心化共享及通訊的程序,它构建了一个强大的分布式存储和通信网络,下面我们就来详细了解其实…

ass字幕嵌入mp4带偏移

# 格式转化文件,包含多种文件的互相转化,主要与视频相关 from pathlib import Path import subprocess import random import os import reclass Utils(object):staticmethoddef get_decimal_part(x: float) -> float:s format(x, .15f) # 格式化为…

05 APP 自动化- Appium 单点触控 多点触控

文章目录 一、单点触控查看指针的指针位置实现手势密码: 二、多点触控 一、单点触控 查看指针的指针位置 方便查看手势密码-九宫格每个点的坐标 实现手势密码: 执行手势操作: 按压起点 -> 移动到下一点 -> 依次移动 -> 释放&am…

【软件】在 macOS 上安装 MySQL

在 macOS 上安装 MySQL 有多种方法,以下是两种常见的安装方式:通过 Homebrew 安装和通过安装包安装。以下是详细的步骤: 一、通过 Homebrew 安装 MySQL Homebrew 是 macOS 的包管理器,使用它安装 MySQL 非常方便。 1.安装 Home…

第11节 Node.js 模块系统

为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的…

力扣热题100之二叉树的直径

题目 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 方法:递归 计算二叉树的直径可以理解…

OpenCV CUDA模块图像处理------创建CUDA加速的Canny边缘检测器对象createCannyEdgeDetector()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于创建一个 CUDA 加速的 Canny 边缘检测器对象(CannyEdgeDetector),可以在 GPU 上高效执行 Canny 边…

unix/linux,sudo,其内部结构机制

我们现在深入sudo的“引擎室”,探究其内部的结构和运作机制。这就像我们从观察行星运动,到深入研究万有引力定律的数学表达和物理内涵一样,是理解事物本质的关键一步。 sudo 的内部结构与机制详解 sudo 的执行流程可以看作是一系列精心设计的步骤,确保了授权的准确性和安…

什么是 TOML?

🛠 Rust 配置文件实战:TOML 语法详解与结构体映射( 在 Rust 中,Cargo.toml 是每个项目的心脏。它不仅定义了项目的名称、版本和依赖项,还使用了一种轻巧易读的配置语言:TOML。 本文将深入解析 TOML 的语法…

react native webview加载本地HTML,解决iOS无法加载成功问题

在react native中使用 “react-native-webview”: “^13.13.5”,加载HTML文件 Android: 将HTML文件放置到android/src/main/assets目录,访问 {uri: file:///android_asset/markmap/index.html}ios: 在IOS中可以直接可以直接放在react native项目下,访问…

数据结构(JAVA版)练习题

(题目难易程度与题号顺序无关哦) 目录 1、多关键字排序 2、集合类的综合应用问题 3、数组排序 4、球的相关计算问题 5、利用类对象计算日期 6、日期计算问题 7、星期日期的计算 8、计算坐标平面上两点距离 9、异常处理设计问题 10、Java源文件…

04-redis-分布式锁-redisson

1 基本概念 百度百科:控制分布式系统之间同步访问共享资源方式。 在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止…

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载(CacheLoader)2.2.1 示例代码 2.3 缓存移除与监听(invalidate removalListener) 3. 缓存回收策略3.1 基于容量的回收&…

使用jstack排查CPU飙升的问题记录

最近,看到短视频传播了一个使用jstack来协助排查CPU飙升的案例。我也是比较感兴趣,参考了视频博主的流程,自己做了下对应案例的实战演练,在此,想做一下,针对相关问题模拟与排查演练的实战过程记录。 案例中…

Sql Server 中常用语句

1.创建用户数据库 --创建数据库 use master --切换到master数据库 go-- 终止所有与SaleManagerDB数据库的连接 alter database SaleManagerDB set single_user with rollback immediate goif exists (select * from sysdatabases where nameSaleManagerDB) drop database Sal…