[框架设计] 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 实际开发中面临的问题 在实际开发中,经常需要打印一个方法的执行时间,以确定是否存在慢操作 最简单的方法,直接修改已有的方法,在finnally语句中打印耗时 Override public Optional<Table> getTable(String da…...
【同步、共享和内容协作软件】上海道宁与ownCloud让您的团队随时随地在任何设备上轻松处理数据
ownCloud是 一款开源文件同步、共享和 内容协作软件 可让团队随时随地 在任何设备上轻松处理数据 ownCloud开发并提供 用于内容协作的开源软件 使团队能够轻松地无缝 共享和处理文件 而无需考虑设备或位置 开发商介绍 ownCloud成立于2010年,是一个托管和同…...
Linux 文件、目录与磁盘格式
用户与用户组 用户:即某个文件的拥有者,可以管理自己账号下的文件,另有一个超级账号 root,可以统一管理全局,利用 su root 命令登录该账号。用户组:相当于群组,多个用户之间可以组成用户组&…...
锁屏面试题百日百刷-Hive篇(五)
锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你…...
java多线程(七)线程等待与唤醒
一、wait()、notify()、notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用࿰…...
第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 的日志级别,产生执行错误相关消息mvn -q - quiet 控制 maven 的日志级别,仅仅显示错误mvn -o - offline 运行 offline 模式,不联网更…...
JavaScript手写题
一、防抖 function debounce(fn, delay200) {let timeout null; // 定时器控制return function(...args) {if (timeout) { // 定时器存在,表示某个动作之前触发过了clearTimeout(timeout); // 清除定时器timeout null;} else {// 对第一次输入立即执行fn.apply…...
为什么图标的宽度总是8的倍数?
对于 Windows 上的所有图标而言,它的宽度总是8的倍数,这可不是因为人们喜欢2的幂,虽然在计算机世界,你会看到很多这样的数字,例如,1024,4096等。 在 Windows 的早期阶段,大多数显卡…...
常用的xpath
一、xpath 语法 简单看一下菜鸟教程即可 1、基本语法 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式: 表达式描述nodename选取此节点的所有子节点。/从根节点选取(取子节点&#…...
【035】基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文
1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统,通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括:首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …...
【Spark分布式内存计算框架——Spark Streaming】7. Kafka集成方式
集成方式 Spark Streaming与Kafka集成,有两套API,原因在于Kafka Consumer API有两套, 文档:http://spark.apache.org/docs/2.4.5/streaming-kafka-integration.html。 方式一:Kafka 0.8.x版本 老的Old Kafka Consum…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
Python异步编程:深入理解协程的原理与实践指南
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断…...
LeetCode - 148. 排序链表
目录 题目 思路 基本情况检查 复杂度分析 执行示例 读者可能出的错误 正确的写法 题目 148. 排序链表 - 力扣(LeetCode) 思路 链表归并排序采用"分治"的策略,主要分为三个步骤: 分割:将链表从中间…...
【字节拥抱开源】字节团队开源视频模型 ContentV: 有限算力下的视频生成模型高效训练
本项目提出了ContentV框架,通过三项关键创新高效加速基于DiT的视频生成模型训练: 极简架构设计,最大化复用预训练图像生成模型进行视频合成系统化的多阶段训练策略,利用流匹配技术提升效率经济高效的人类反馈强化学习框架&#x…...
浏览器工作原理01 [#]Chrome架构:仅仅打开了1个页面,为什么有4个进程
引用 浏览器工作原理与实践 Chrome打开一个页面需要启动多少进程?你可以点击Chrome浏览器右上角的“选项”菜单,选择“更多工具”子菜单,点击“任务管理器”,这将打开Chrome的任务管理器的窗口,如下图 和Windows任务管…...
