MVC和MVVM模式的区别

news/2025/2/4 18:20:47/

MVVM 和 MVC 都是软件架构模式,其中 MVVM 表示“Model-View-ViewModel”,而 MVC 表示“Model-View-Controller”。

MVC 模式中,控制器(Controller)充当视图(View)和模型(Model)之间的中介,将用户输入从视图传递到模型并将模型状态更新反映回视图。这种方式有助于分离应用程序的不同部分,并促进代码重用和可维护性。

MVVM 模式也旨在实现分离视图和业务逻辑。在 MVVM 中,ViewModel 充当视图(View)和模型(Model)之间的中介,并向视图公开数据和命令(Command)。 ViewModel 通过数据绑定机制将其状态同步到视图上。这种方式有助于提高应用程序的可测试性以及使用数据绑定带来的生产力增益。

因此,MVVM 与 MVC 的区别在于

  1. 视图和模型之间的通信方式不同:在 MVC 中,视图直接与控制器通信,并通过控制器与模型交互;而在 MVVM 中,视图通过数据绑定与 ViewModel 通信,并由 ViewModel 与模型交互。

  2. MVVM 引入了 ViewModel 层:ViewModel 是一个介于视图和模型之间的中间层,负责处理视图显示和用户输入的逻辑。这个层的引入使得视图和模型之间的耦合度更低,也使得视图和业务逻辑的重用性更高。

  3. 数据绑定:MVVM 中的视图和 ViewModel 之间通过数据绑定实现双向通信,而在 MVC 中,视图和控制器之间只能通过事件监听和回调等方式进行单向通信。

下面是一个简单的 MVVM 和 MVC 的 demo:

MVVM:

// Model
class Person {constructor(firstName, lastName) {this.firstName = firstName;this.lastName = lastName;}
}// ViewModel
class PersonViewModel {constructor(person) {this.person = person;}get fullName() {return `${this.person.firstName} ${this.person.lastName}`;}set fullName(value) {const [firstName, lastName] = value.split(' ');this.person.firstName = firstName;this.person.lastName = lastName;}
}// View
const input = document.querySelector('input');
const output = document.querySelector('p');// Data binding
const person = new Person('John', 'Doe');
const viewModel = new PersonViewModel(person);
input.value = viewModel.fullName;
input.addEventListener('input', (event) => {viewModel.fullName = event.target.value;output.innerText = viewModel.fullName;
});

MVC:

// Model
class Person {constructor(firstName, lastName) {this.firstName = firstName;this.lastName = lastName;}
}// Controller
class PersonController {constructor(person, view) {this.person = person;this.view = view;}updateFullName(fullName) {const [firstName, lastName] = fullName.split(' ');this.person.firstName = firstName;this.person.lastName = lastName;this.updateView();}updateView() {this.view.update(this.person.firstName + ' ' + this.person.lastName);}
}// View
class PersonView {constructor(controller) {this.controller = controller;this.input = document.querySelector('input');this.output = document.querySelector('p');this.init();}init() {this.input.value = this.controller.person.firstName + ' ' + this.controller.person.lastName;this.input.addEventListener('input', (event) => {this.controller.updateFullName(event.target.value);});this.update(this.input.value);}update(value) {this.output.innerText = value;}
}// Create objects and start the app
const person = new Person('John', 'Doe');
const view = new PersonView(new PersonController(person, new PersonView()));

MVVM(Model-View-ViewModel)的好处如下:

  1. 分离关注点:MVVM 将用户界面(View)与业务逻辑(ViewModel)分离,使得代码维护更加容易,并且能够提高代码的可读性和可测试性。

  2. 易于扩展:由于 MVVM 模式中的每个组件都是独立的,因此您可以轻松地添加新功能或更改现有功能而不影响其他部分。

  3. 可重用性:MVVM 模式促进了代码重复使用,因为 ViewModel 可以轻松地在多个视图之间共享。

  4. 容易维护:MVVM 模式允许开发人员专注于业务逻辑和数据,而不必考虑视图的状态管理和同步问题。

  5. 支持异步和数据绑定:MVVM 模式通过双向数据绑定和命令来支持异步操作,这使得 UI 的更新变得更加容易和直观。


http://www.ppmy.cn/news/46998.html

相关文章

C语言中如何判断大小端字节序?

大小端(Endian)是指多字节整数在内存中存储的方式。在计算机中,一个多字节整数由多个字节组成,而不同的机器和处理器在存储多字节整数时会有两种不同存储方式,分别为大端字节序和小端字节序。 以一个4字节整数0x12345…

RHCE第二次作业

一、配置nto时间服务器,确保客户端主机和服务器主机同步时间 1、NTP是网络时间同步协议,就是用来同步网络中各个计算机的时间的协议。 2、NTP服务端配置 (1)检查系统是否安装了NTP包(Linux一般自带NTP4.2)&…

图染色问题的NP完全性证明

文章目录 1.Overview2.CNF 3-sat3. Gadgets3.1 Concolorous Edges3.2 Starter/Variable Gadget3.3 Splitter Gadget3.4 OR Gadget3.5 Clause Gadget 4. To Planar Graph 最近在学 6.890,然后 devans 刚好问了我这个问题,然后尝试编了一个证明。 1.Overv…

【JSP学习笔记】4.JSP 隐式对象及客户端请求

前言 本章介绍JSP的隐式对象及客户端请求。 JSP 隐式对象 JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。 JSP所支持的九大隐式对象: 对象描述requestHttpServletRequest 接…

【C++】模板进阶--非类型模板参数模板特化及分离编译

文章目录 一、非类型模板参数二、模板的特化1.模板特化的概念2.函数模板的特化3.类模板的特化3.1 全特化3.2 偏特化 4.类模板特化应用示例 三、模板的分离编译四、模板总结 一、非类型模板参数 模板参数分为类型形参与非类型形参,其中,类型形参即出现在…

【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解

前言 注意力机制一直是一个比较热的话题,其实在很早之前就提出了,我们在学习图像分类时在SENet就见到过(直通车:经典神经网络论文超详细解读(七)——SENet(注意力机制)学习笔记&…

Vue 3的新特性介绍

Vue是一款流行的JavaScript框架,用于构建现代Web应用程序。Vue 2已经成为前端开发者的首选框架之一,但是在2020年,Vue 3正式发布,带来了一系列重要的新特性和功能。本文将介绍Vue 3相对于Vue 2的新特性和功能,以及它们…

Nature子刊:HPV改变阴道菌群的机制

​ 研究背景 人类乳头瘤病毒(HPV)是最常见的性传播感染,影响全球3亿人以上。 虽然大多数感染像得了场“感冒”一样被免疫系统清除,或保持在无症状或潜伏状态,但致癌(高危)HPV株(如最明显的HPV16和18型)会导致宫颈鳞状上皮内病变[低级别(LSIL…