当前位置: 首页 > news >正文

[框架设计] MVVM 的介绍,应用及优缺点

介绍

MVVM(Model-View-ViewModel)是一种架构模式,用于将应用程序分离为三个部分:

  • Model(模型):负责处理应用程序的数据和业务逻辑。
  • View(视图):负责呈现用户界面并处理用户交互。
  • ViewModel(视图模型):作为Model和View之间的中介,处理View的显示逻辑和用户交互,并将这些操作转换为Model可用的操作。

在MVVM中,View是完全独立于Model的,ViewModel则是连接View和Model的桥梁。View通过ViewModel访问Model中的数据和方法,ViewModel则将Model中的数据和方法转换为View中可用的形式。ViewModel还可以控制View的显示逻辑和用户交互,以使View更加易于维护和扩展

在实际应用中,MVVM可以用于各种类型的应用程序,包括Web应用程序、桌面应用程序和移动应用程序等。

在unity的应用实例

一个简单的登录功能为例,说明MVVM的应用:

  • Model层
    在Model层,我们定义了一个User类,用于存储用户的信息,包括用户名和密码等:

public class User
{public string UserName { get; set; }public string Password { get; set; }
}
  • View层
    在View层,我们使用Unity提供的UI组件,构建一个简单的登录界面,并与ViewModel进行绑定,以实现双向数据绑定。代码如下:

public class LoginView : MonoBehaviour
{public InputField usernameInput;public InputField passwordInput;public Button loginButton;private LoginViewModel viewModel;private void Awake(){viewModel = new LoginViewModel();viewModel.UserName = "";viewModel.Password = "";viewModel.LoginCommand = new Command(Login);usernameInput.onValueChanged.AddListener(value =>{viewModel.UserName = value;});passwordInput.onValueChanged.AddListener(value =>{viewModel.Password = value;});loginButton.onClick.AddListener(() =>{viewModel.LoginCommand.Execute(null);});}private void Login(){if (viewModel.ValidateUser()){Debug.Log("Login succeeded");}else{Debug.Log("Login failed");}}
}

在View层中,我们定义了一个LoginView类,它包含了登录界面上的UI组件,如输入框和按钮等。在Awake()函数中,我们创建了一个LoginViewModel对象,并将其与UI组件进行绑定。这里使用了Unity中的事件监听器,以实现双向数据绑定。在Login()函数中,我们调用LoginViewModel中的ValidateUser()方法,用于验证用户输入的用户名和密码是否正确。

  • ViewModel层
    在ViewModel层,我们创建了一个LoginViewModel类,它继承自INotifyPropertyChanged接口,用于实现双向数据绑定。代码如下:

public class LoginViewModel : INotifyPropertyChanged
{private User user;public string UserName{get { return user.UserName; }set{user.UserName = value;OnPropertyChanged(nameof(UserName));}}public string Password{get { return user.Password; }set{user.Password = value;OnPropertyChanged(nameof(Password));}}public Command LoginCommand { get; set; }public LoginViewModel(){user = new User();}public bool ValidateUser(){// validate user logicreturn true;}public event PropertyChangedEventHandler PropertyChanged;private void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

在LoginViewModel类中,我们定义了一个User对象,用于存储用户输入的用户名和密码。在UserName和Password属性中,我们实现了INotifyPropertyChanged接口,以实现双向数据绑定。在LoginCommand属性中,我们定义了一个Command对象,用于实现登录功能。在ValidateUser()方法中,我们定义了验证用户的逻辑。

和MVC对比优缺点:
MVVM和MVC的主要区别在于ViewModel的存在,它在View和Model之间起到了一个桥梁的作用,负责把Model中的数据转化为View需要的数据格式,并且在View中用户交互的操作会通过ViewModel传递到Model中进行相应的处理,最后再将Model的数据更新到View上。

MVVM的优点:

1.松耦合:MVVM是通过数据绑定实现的,View和ViewModel之间没有直接的耦合,View只负责展示数据,ViewModel负责处理数据和业务逻辑,而不需要和View直接交互。

2.可维护性:ViewModel中的业务逻辑和数据处理可以进行单元测试,使得代码更加可维护和易于扩展。

3.可重用性:ViewModel中的逻辑和处理是独立于View的,因此可以在多个View中重用同一个ViewModel。

4.可扩展性:由于ViewModel的存在,当应用需要增加新的功能时,可以在ViewModel中进行相应的处理而不需要修改View和Model的代码。

MVVM的缺点:

1.学习曲线:相对于MVC来说,MVVM需要掌握更多的技术和知识,比如数据绑定、命令绑定等。

2.性能问题:由于MVVM中使用了数据绑定,因此在处理大量数据时可能会影响性能。

3.过度设计:有时候为了实现MVVM的松耦合和可维护性,可能会导致代码过度设计,增加了代码的复杂性。

总的来说,MVVM相对于MVC来说,更加适合大型复杂的应用程序,能够提高代码的可维护性和可重用性。但是对于小型应用程序来说,MVVM可能会增加代码的复杂度和开发成本。

相关文章:

[框架设计] MVVM 的介绍,应用及优缺点

介绍 MVVM(Model-View-ViewModel)是一种架构模式,用于将应用程序分离为三个部分: Model(模型):负责处理应用程序的数据和业务逻辑。View(视图):负责呈现用户…...

4G模块DTU网关远程抄表方案(二):DL645/698协议国网电表

4G模块DTU网关远程抄表方案(二):DL645/698协议国网电表 1 DL 645协议简介 DL645协议是一种用于智能电能表的远程抄读通讯标准。制定该标准是为统一和规范多功能电能表与数据终端设备进行数据交换时的物理连接和通信链路及应用技术规范。DL645协议可用于远程监测电力传输和使用…...

认识微服务

目录 认识微服务 单体架构 分布式架构 服务架构演变 服务治理 微服务 总结 微服务技术对比 微服务结构 微服务技术对比 企业需求 SpringCloud SpringCloud和SpringBoot的版本兼容 认识微服务 单体架构 单体架构:将业务的所有功能集中在一个项目中开发&a…...

升级Android Studio Electric Eel问题汇总

1.升级以后找不到java可执行程序 问题原因:升级后,Android Studio自带的java目录不再是根目录/jre,调整为一个新目录 Studio根目录/jbr 修改方法:1)修改系统环境变量, JAVA_HOME调整为Studio下对应的java…...

令执法机构头疼的“虚拟货币犯罪”,为何链上天眼能“行”

谈到洗钱,你脑海中率先想到的可能是影视剧中利用赌场、收藏品拍卖等来实施犯罪。其实洗钱犯罪的花样不止于此,在近期热播的扫黑剧《狂飙》中,唐小龙为洗白“赌博资金、高利贷业务”,便通过“卖酒网销”的方式达成洗钱目的。 随着科…...

【unity】开发rts 3

一 出生点、阵营类型、阵营 实例栏-GameManage,默认有一个插槽 size 插槽数量 role 权限,host是主人,权限高 type 阵营类型,不选不限制,选的效果没看懂,文档原文: The Type field in Data al…...

突破老旧OA系统局限,打通五大业务管理体系,让效率“狂飙”

目录 用无代码构建上海致远信息化平台 一、支持类(行政人事、财务)体系 二、营销体系 三、供应链体系 四、质量管理体系 五、技术研发体系 下一步规划 我们公司用的第一套系统是 IBM 的系统,部署在本地服务器,这套系统用了十几年,当时 2020 年要全部迁移到LCHub低代…...

【vue2小知识】路由守卫的使用与解决RangeError: Maximum call stack size exceeded问题的报错。

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:当我们在路由跳转前与后我们可实现触发的操作 【前言】当我们在做类似于登录页面的时候&…...

Google Guice 5:AOP

1. AOP 1.1 实际开发中面临的问题 在实际开发中&#xff0c;经常需要打印一个方法的执行时间&#xff0c;以确定是否存在慢操作 最简单的方法&#xff0c;直接修改已有的方法&#xff0c;在finnally语句中打印耗时 Override public Optional<Table> getTable(String da…...

【同步、共享和内容协作软件】上海道宁与​ownCloud让您的团队随时随地在任何设备上轻松处理数据

ownCloud是 一款开源文件同步、共享和 内容协作软件 可让团队随时随地 在任何设备上轻松处理数据 ownCloud开发并提供 用于内容协作的开源软件 使团队能够轻松地无缝 共享和处理文件 而无需考虑设备或位置 开发商介绍 ownCloud成立于2010年&#xff0c;是一个托管和同…...

Linux 文件、目录与磁盘格式

用户与用户组 用户&#xff1a;即某个文件的拥有者&#xff0c;可以管理自己账号下的文件&#xff0c;另有一个超级账号 root&#xff0c;可以统一管理全局&#xff0c;利用 su root 命令登录该账号。用户组&#xff1a;相当于群组&#xff0c;多个用户之间可以组成用户组&…...

锁屏面试题百日百刷-Hive篇(五)

锁屏面试题百日百刷&#xff0c;每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线&#xff0c;官网地址&#xff1a;https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容&#xff0c;还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你…...

java多线程(七)线程等待与唤醒

一、wait()、notify()、notifyAll()等方法介绍 在Object.java中&#xff0c;定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态&#xff0c;同时&#xff0c;wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用&#xff0…...

第13天-仓储服务(仓库管理,采购管理 ,SPU规格维护)

1.仓储服务开发配置 1.1.加入到Nacos注册中心 spring:application:name: gmall-warecloud:nacos:discovery:server-addr: 192.168.139.10:8848namespace: 36854647-e68c-409b-9233-708a2d41702c1.2.配置网关路由 spring:cloud:gateway:routes:- id: ware_routeuri: lb://gmal…...

Maven 命令行及例子

基本 mvn -v - show-version -version 显示版本信息mvn -h - help 显示帮助信息mvn -e -errors控制 maven 的日志级别&#xff0c;产生执行错误相关消息mvn -q - quiet 控制 maven 的日志级别&#xff0c;仅仅显示错误mvn -o - offline 运行 offline 模式&#xff0c;不联网更…...

JavaScript手写题

一、防抖 function debounce(fn, delay200) {let timeout null; // 定时器控制return function(...args) {if (timeout) { // 定时器存在&#xff0c;表示某个动作之前触发过了clearTimeout(timeout); // 清除定时器timeout null;} else {// 对第一次输入立即执行fn.apply…...

为什么图标的宽度总是8的倍数?

对于 Windows 上的所有图标而言&#xff0c;它的宽度总是8的倍数&#xff0c;这可不是因为人们喜欢2的幂&#xff0c;虽然在计算机世界&#xff0c;你会看到很多这样的数字&#xff0c;例如&#xff0c;1024&#xff0c;4096等。 在 Windows 的早期阶段&#xff0c;大多数显卡…...

常用的xpath

一、xpath 语法 简单看一下菜鸟教程即可 1、基本语法 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式&#xff1a; 表达式描述nodename选取此节点的所有子节点。/从根节点选取&#xff08;取子节点&#…...

【035】基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文

1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统&#xff0c;通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括&#xff1a;首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …...

【Spark分布式内存计算框架——Spark Streaming】7. Kafka集成方式

集成方式 Spark Streaming与Kafka集成&#xff0c;有两套API&#xff0c;原因在于Kafka Consumer API有两套&#xff0c; 文档&#xff1a;http://spark.apache.org/docs/2.4.5/streaming-kafka-integration.html。 方式一&#xff1a;Kafka 0.8.x版本 老的Old Kafka Consum…...

如何引入elementUI

elementUI的引入完整引入按需引入完整引入 在 main.js 中写入以下内容&#xff1a; import Vue from ‘vue’; import ElementUI from ‘element-ui’; import ‘element-ui/lib/theme-chalk/index.css’; import App from ‘./App.vue’; Vue.use(ElementUI); new Vue({ el: ‘…...

vue3+rust个人博客建站日记4-Vditor搞定MarkDown

即然是个人博客&#xff0c;那么绝对不能丢给自己一个大大的输入框敷衍了事。如果真是这样&#xff0c;现在就可以宣布项目到此结束了。如今没人享受用输入框写博客。作为一个有追求的程序员&#xff0c;作品就要紧跟潮流。 后来&#xff0c;Markdown 的崛起逐步改变了大家的排…...

KDZD-JC软化击穿试验仪

一、概 述 KDZD-JC智能软化击穿试验仪是根据GB/T4074.6-2008和idtIEC60851-6:2004标准而设计的一种新型漆包圆线检测仪器。主要适用于固体绝缘材料&#xff08;如&#xff1a;塑料、橡胶、层压材料、薄膜、树脂、云母、陶瓷、玻璃、绝缘漆等绝缘材料及绝缘件&#xff09;在工…...

【数据结构】单链表的C语言实现--万字详解介绍

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.链表1.1 链表的概念…...

电子科技大学软件工程期末复习笔记(七):测试策略

目录 前言 重点一览 V模型 回归测试 单元测试 集成测试 重要概念 自顶向下的集成方法 自底向上的集成方法 SMOKE方法 系统测试 验收测试 α测试 β测试 本章小结 前言 本复习笔记基于王玉林老师的课堂PPT与复习大纲&#xff0c;供自己期末复习与学弟学妹参考用…...

逆向-还原代码之除法 (Interl 64)

除法和32位差不多&#xff0c;毕竟背后的数学公式是一样的。区别只是32位的乘法需要两个寄存器来存放大数相乘的结果&#xff0c;而64位的不需要&#xff0c;一个寄存器就能存下。所以在64位的环境下&#xff0c;多了右移32位这条指令&#xff0c;其他指令一样。 //code #incl…...

Python WebDriver自动化测试

Webdriver Selenium 是 ThroughtWorks 一个强大的基于浏览器的开源自动化测试工具&#xff0c;它通常用来编写 Web 应用的自动化测试。 Selenium 2&#xff0c;又名 WebDriver&#xff0c;它的主要新功能是集成了 Selenium 1.0 以及 WebDriver​&#xff08;WebDriver 曾经是…...

2023年微信小程序获取手机号授权登录注册详细教程,包含服务端教程

前言 小程序中有很多地方都会用到用户的手机号&#xff0c;比如登陆注册&#xff0c;填写收货地址等等。有了这个组件可以快速获取微信绑定手机号码&#xff0c;无须用户填写。网上大多数教程还是往年的&#xff0c;而微信官方的api已做了修改。本篇文章将使用最新的方法获取手…...

YOLOv8模型学习笔记

在前面的章节中博主学习了YOLOv5的相关知识&#xff0c;从YOLOv5的数据增强处理到模型设计&#xff0c;从正负样本匹配策略到LOSS设计&#xff0c;今天博主学习的是YOLOv8&#xff0c;同为ultralytics公司的产品&#xff0c;两者无论是思想层面还是具体的设计方面都有着异曲同工…...

Java SE知识点1

一、continue、break、和return的区别是什么? 在循环结构中,当循环条件不满足或者循环次数达到要求时,循环会正常结束。但是,有时候可能需要 在循环的过程中,当发生了某种条件之后 ,提前终止循环,这就需要用到下面几个关键词: 1. continue :指跳出当前的这一次循环,…...

沈阳医疗网站建设/今天最新的新闻头条新闻

实 战环境介绍&#xff1a; 服务器名 IP 系统 MySQL odd.example.com 192.168.1.116 rhel-5.8 5.5.16 even.example.com 192.168.1.115 rhel-5.8 5.5.16 假设要同步的库是 db_rocky ㈠ 创建同步用户 在 ODD上 mysql grant replication slave on *.* to water192.168实战环境介绍…...

动漫设计需要什么基础/上海谷歌优化

WindowAdapter类&#xff1a; 1.接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。 2.扩展此类可创建 WindowEvent 侦听器并为所需事件重写该方法。&#xff08;如果要实现 WindowListener 接口&#xff0c;则必须定义该接口内的所有方法。…...

苹果网站上物体阴影怎么做的/整站快速排名

列表&#xff1a;1.创建列表&#xff08;1&#xff09;直接将一个列表对象赋给变量>>> a[1,2,3,4,5] >>> a [1, 2, 3, 4, 5]>>> a_list[a,b,mpilgrim,z,example] >>> a_list [a, b, mpilgrim, z, example] >>> a_list[] #创建空…...

建设银行网站适用浏览器/厦门seo全网营销

Java中的set是一个不包含重复元素的集合&#xff0c;确切地说&#xff0c;是不包含e1.equals(e2)的元素对。Set中允许添加null。Set不能保证集合里元素的顺序。 在往set中添加元素时&#xff0c;如果指定元素不存在&#xff0c;则添加成功。也就是说&#xff0c;如果set中不存在…...

网站点击弹出下载框 怎么做/软文写手接单平台

2019独角兽企业重金招聘Python工程师标准>>> es:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/distributed-cluster.html 下一篇&#xff1a;http://my.oschina.net/qiangzigege/blog/264127 内容&#xff1a; Elasticsearch的目标是可用…...

风景旅游网页设计/百度关键词seo公司

文章目录1、使用1G内存够&#xff0c;从 10 GB 大的文件中获取出现次数为 top3 多的 IP&#xff1f;2、分析2.1、可能出现的IPV4个数及所需存储空间2.2、分而治之的思路2.2.1、大文件拆小文件&#xff08;相同IP放到同一组文件&#xff09;2.2.2、对小文件的 IP 进行遍历计数(I…...