MVVM (Model-View-ViewModel Pattern)

news2024/11/26 9:31:26

MVVM 模式中有三个核心组件:模型、视图和视图模型。 每个组件的用途不同。 下图显示了这三个组件之间的关系。

在交互层次上,视图“了解”视图模型,视图模型“了解”模型,但模型不知道视图模型,而视图模型不知道视图。 因此,视图模型将视图与模型隔离开来,并允许模型独立于视图进行演变。

使用 MVVM 模式的好处如下:

  • 模型实现封装了业务逻辑,更改它可能很困难或有风险。 在此场景中,视图模型充当模型类的适配器,并阻止你对模型代码进行重大更改。
  • 可以在不使用视图的情况下为视图模型和模型创建单元测试。 视图模型的单元测试可以执行与视图使用的完全相同的功能。
  • 无需接触视图模型和模型代码即可重新设计应用 UI。 因此,新版本的视图应与现有视图模型一起使用。
  • 设计人员可以专注于视图,而开发人员可以处理视图模型和模型组件。

有效使用 MVVM 的关键在于了解如何将应用代码分解为正确的类以及这些类的交互方式。 下面几节讨论 MVVM 模式中每个类的责任。

view

View(视图)负责定义用户在屏幕上看到的结构(structure)、布局(layout)和外观(appearance)。理想情况下,视图完全使用QML/XAML定义,包含很少(受限制)的后台代码,不包含业务逻辑。

在应用程序中,视图通常是一个页面。此外,视图也可以是父视图的子组件。

视图可以有自己的视图模型,也可以继承其父视图模型。视图通过绑定或调用视图模型上的方法从视图模型获取数据。在运行时,当UI控件响应引发更改通知事件的视图模型属性时,视图将发生更改。

Model

MVVM中的Model(模型)是应用程序领域模型的实现,它包括数据模型以及业务和验证逻辑。模型对象的示例包括存储库、业务对象、数据传输对象(dto)、以及生成的实体和代理对象。

ViewModel

ViewModel(视图模型)充当视图和模型之间的中介,并负责处理视图逻辑。通常,视图模型通过调用模型类中的方法与模型进行交互。

viewModel可以很容易的使用Model中的数据。视图模型从模型中检索数据,然后使数据对视图可用,并可能以某种方式重新格式化数据,使视图更容易处理。

viewModel还提供了应用程序用户在视图中发起的命令的实现。例如,当用户单击UI中的按钮时,该操作可以触发视图模型中的命令。视图模型还可能负责定义影响视图中显示的某些方面的逻辑状态更改,例如指示某些操作正在挂起。

为了使视图模型参与与视图的双向数据绑定,其属性必须引发PropertyChanged事件。

使用MVVM模式,应用程序的UI以及底层的表示和业务逻辑被分为三个独立的类:

视图:它封装了UI和UI逻辑;

视图模型:它封装了表示逻辑和状态;

模型:封装应用程序的业务逻辑和数据。

类的职责和特点

MVVM类及其交互

与所有分离的表示模式一样,有效使用MVVM模式的关键在于理解将应用程序代码分解为正确类的适当方法,以及理解这些类在各种场景中的交互方式。

视图还是视图模型?

很多时候,确定某个功能应该在哪里实现并不明显。一般的经验法则是:任何与屏幕上UI的特定视觉外观有关的东西,以及以后可能被重新设计的东西(即使你目前不打算重新设计它)都应该进入视图;任何对应用程序的逻辑行为很重要的东西都应该放到视图模型中。此外,由于视图模型不应该明确了

解视图中特定的可视元素,因此以编程方式操作视图中可视元素的代码应该驻留在视图的代码后面,或者封装在行为中。类似地,检索或操作通过数据绑定在视图中显示的数据项的代码应该驻留在视图模型中。

例如,列表框中选中项目的高亮颜色应该在视图中定义,但是要显示的项目列表以及对选中项目本身的引用应该由视图模型定义。

模型封装了业务逻辑和数据。

什么是业务逻辑?业务逻辑被定义为与应用程序数据的检索和管理有关的任何应用程序逻辑,并用于确保数据一致性和有效性的任何业务规则。

为了最大化重用机会,模型应该具备以下特点:

模型不应该包含任何特定于用例;

模型不应该特定于用户任务或行为;

模型不应该特定于应用程序逻辑。

如果您的模型类没有实现所需的接口怎么办?

有时,您将需要处理不实现INotifyPropertyChanged、INotifyCollectionChanged、IDataErrorInfo或INotifyDataErrorInfo接口的模型对象。在这些情况下,视图模型可能需要包装模型对象并向视图公开所需的属性。这些属性的值将由模型对象直接提供。视图模型将为它所公开的属性实现所需的接

口,以便视图可以轻松地与它们进行数据绑定。

总结:

模型类是封装应用程序数据和业务逻辑的非可视化类。它们负责管理应用程序的数据,并通过封装所需的业务规则和数据验证逻辑来确保数据的一致性和有效性。

模型类不直接引用视图或视图模型类,也不依赖于它们的实现方式。

模型类通常与封装数据访问和缓存的服务或存储库一起使用。

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

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

相关文章

链表内指定区间反转

题目: 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。 例如: 给出的链表为 1→2→3→4→5→NULL,m2,n4 返回 1→4→3→2→5→NULL 数据范围&#xff…

日常开发中,提升技术的13个建议

前言 1. 打好基础,深入学习语言特性 比如,对于Java程序员来说,要了解Java语言的基本概念和核心特性,包括面向对象编程、集合框架、异常处理、多线程等等。可以通过阅读Java的官方文档、教程、参考书籍或在线资源来学习。 如果最基本的基础都不扎实&…

OOM 如何监控可视化、告警推送、服务自愈

OOM,out of memory,就是内存用完了耗尽了的意思。会触发kernel调用OOM killer杀进程来解除这种状况。 OOM分为虚拟内存OOM和物理内存OOM,两者是不一样的。 虚拟内存OOM发生在用户空间,用户空间分配的就是虚拟内存,不…

【裸机驱动LED】使用汇编代码驱动LED(四)—— 驱动格式开发篇

上一篇使用C语言代码来驱动LED,之前我们是手动设置的每一个寄存器的地址,但是这样的效率太低,而且很麻烦。此时我们注意到同属于 GPIO_CCGRx 这一类的寄存器地址,他们之间都相差 4 个字节。 我们要利用这一特性,将之前…

SciencePub学术 | 【CCF推荐】计算机决策类重点SCIEI征稿中

SciencePub学术 刊源推荐: 【CCF推荐】计算机决策类重点SCI&EI征稿中!信息如下,录满为止: 一、期刊概况: CCF推荐|计算机决策类重点SCI&EI 【期刊简介】IF:3.5-4.0,JCR2区,中科院3/4区…

OpenCV 数据类型及赋值取值

在之前的博客 OpenCV 32F 与 8U Mat数据类型相互转换(C版) 已经提到,OpenCV Mat 类型及对应编号,如下表: 其中C1~C4为通道数,经常使用的数据类型对应如下表所示: 其中: FLT_MAX 3.402823466e38 FLT_MIN …

从亿点点失误,到一点点失误,我是如何做的【工作失误怎么办】

前言 只要我们还在做事,或者说还活着,就没有不犯错的时候。作为一名前端搬砖工,哪怕工作中再仔细小心,也免不了一些失误。 那这是不是说,失误很正常,改了就是嘛? 这么说好像没错。作为失误本…

[Java基础]面向对象-内存解析

因为内存解析篇幅较长,我们单独拿出来讲解。 我们知道,方法执行,其实就对内存的操作,但具体是如何进行的呢?下面我们以生成“圆”为例,从内存的角度解析程序执行过程。 /** * 圆 **/ public class Circle…

5年测试面试要20K,面试三个问题把我打发走了···

都说金三银四,金九银十跳槽涨薪季,我是着急忙慌的准备简历——5年软件测试经验,可独立测试大型产品项目,熟悉项目测试流程…薪资要求?5年测试经验起码能要个20K吧。 我加班肝了一页半简历,投出去一周&…

22种不同的社交媒体内容类型(2023年指南)

您是否觉得自己的社交媒体帖子陷入了无休止的循环?您是否已经无话可说并且感到厌烦了?看起来你没有得到任何牵引力吗? 别担心 — 这些感觉在营销人员和小企业主中很常见。今天,我们将探索社交媒体内容的世界,并为您提…

React-Router 5.0 制作导航栏+页面参数传递

React使用路由 使用React构建SPA应用(单页面应用),要想实现页面间的跳转,首先想到的就是使用路由。在React中,常用的有两个包可以实现这个需求,那就是react-router和react-router-dom。本文主要针对react-router-dom进行说明。 …

麒麟V10服务器 安装samba 软件,并且实现远程连接(压缩包形式)

目录 1 安装包2 实现3 如何查看安装的sambd 的版本4 使用 1 安装包 百度网盘 链接: https://pan.baidu.com/s/1l6HDAGE4_Itj-cp7XtpUNg 提取码: 100w 复制这段内容后打开百度网盘手机App,操作更方便哦2 实现 以下是在Linux系统中使用压缩包方式安装Samba服务的步…

angular框架-通过依赖注入方式挂载loading以实现任意地方一行代码调用全局loading

前言 本文主要阐述关于在angular项目中,loading的常见的使用方式,以及如何全局挂载loading,实现一行代码控制loading开,一行代码控制loading关闭。 正文 首先在angular中增加loading,主要就是组件级和全局挂载&…

Python+appium自动化测试-调用服务器接口

当前很多APP登录都需要绑定手机号,但当我们需要足够多的模拟新用户的注册登录时,无法提供大量的手机号来测试,所以可以让服务器给出一个清除账号的接口,在写自动化脚本的时候可以调用这个接口,保证能够使用一个账号进行…

pycharm的基本使用

废话文学 本人记录笔记始终遵循“能动手绝不动脑,能动脑绝不动手”的基本原则。不会的操作,跟着笔记干就完事了,还动啥脑袋?留着脑细胞刷抖音擦边小姐姐他不香吗? 什么是IDE IDE即【集成开发环境】,Inte…

【Algorithm】Java刷题中要熟练使用的容器Api、Stream流、Lambda表达式

Java刷题中要熟练使用的Stream流、Lambda表达式、容器Api 1.Stream流1.概述2.分类3.具体用法流的常用创建方法 2.Lambda表达式函数式接口Lambda书写语法方法引用 3.各类Api 1.Stream流 1.概述 Stream Api是「集合操作」的一种简化表达形式。其特点是惰性求值,流在…

maven repositories更新失败

在项目的pom文件中添加以下配置 <repositories><repository><id>alimaven</id><name>Maven Aliyun Mirror</name><url>http://maven.aliyun.com/nexus/content/repositories/central/</url><releases><enabled>tr…

视频批量剪辑软件开发源码+SaaS

工具能力 API 描述 上传素材接口 开发者可通过本接口将使用素材上传至抖音服务器。 上传临时素材接口 上传临时素材接口。 获取素材列表接口 获取素材列表接口。 删除素材接口 删除素材接口。 小程序接口能力 获取小程序接口能力。 模拟webhook事件 模拟webhook事…

基于Python的接口自动化-HTTP接口基本组成和网页构成

目录 引言 1、HTTP简介 2、HTTP原理和网页基础 2.1、 HTTP基本原理 2.2、 HTTP请求过程 2.3、 网页构成 【自动化测试工程师学习路线】 引言 在我们进行接口测试时&#xff0c;了解HTTP接口的基本组成和网页构成是非常重要的。 而Python作为一门功能强大、易学易用的编程…

亚马逊美国站 解压神器减压小玩具CPC认证

解压玩具又称减压玩具Relaxing toys&#xff0c;包括挤压、摔砸、揉捏、旋转等多种类型&#xff0c;主要供成年人使用&#xff0c;帮助释放压力。 当提到解压玩具时&#xff0c;通常指的是一类旨在缓解压力、放松心情的小型玩具。以下是几种常见的解压玩具及其简要介绍&#x…