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

【面试题】MVC、MVP与MVVM模式是什么?

  •  MVC模式

MVC是应用最广泛的软件架构之一,一般MVC分为:

Model( 模型 )Controller( 控制器 )View( 视图 )

这主要是基于分层的目的,让彼此的职责分开。View 一般通过 Controller 来和 Model 进行联系。ControllerModelView 的协调者,ViewModel不直接联系。基本联系都是单向的。

1、View 传送指令到 Controller

2、Controller 完成业务逻辑后,要求 Model 改变状态

3、Model 将新的数据发送到 View,用户得到反馈  

  • MVP模式

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

1、各部分之间的通信,都是双向的。

2、View 与 Model 不发生联系,都通过 Presenter 传递。

3、View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

  • MVVM模式

MVVM 是把 MVCControllerMVPPresenter 改成了 ViewModel

View 的变化会自动更新到 ViewModelViewModel 的变化也会自动同步到 View上显示。这种自动同步是因为 ViewModel 中的属性实现了 Observer,当属性变更时都能触发对应的操作。

 

  • MVVM模式的优点  

1、低耦合视图(View)可以独立于 Model 变化和修改,一个 ViewModel 可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。

2、可重用性你可以把一些视图逻辑放在一个ViewModel里面,让很多 view 重用这段视图逻辑。

3、独立开发开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。

4、可测试界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

  • MVVM 和 MVC 的区别

  • mvc 中 Controller演变成 mvvm 中的 viewModel。

  • mvvm 通过数据来显示视图层而不是节点操作。

  • mvvm主要解决了: mvc中大量的DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。

常见的实现MVVM数据绑定的做法有哪些?

实现数据绑定的做法有大致如下几种:

发布者-订阅者模式(backbone.js) 脏值检查(angular.js) 数据劫持(vue.js)

1、发布者-订阅者模式:


一般通过sub, pub的方式实现数据和视图的绑定监听, 更新数据方式通常做法是 vm.set('property', value)

这种方式现在毕竟太low了,我们更希望通过 vm.property = value这种方式更新数据,同时自动更新视图,于是有了下面两种方式。


2、脏值检查:


angular.js 是通过脏值检测的方式比对数据是否有变更,来决定是否更新视图,

最简单的方式就是通过 setInterval() 定时轮询检测数据变动,

angular只有在指定的事件触发时进入脏值检测,大致如下:

1、DOM事件,譬如用户输入文本,点击按钮等。( ng-click )
​
2、XHR响应事件 ( $http )
​
3、浏览器Location变更事件 ( $location )
​
4、Timer事件( $timeout , $interval )
​
5、执行 $digest() 或 $apply()

3、数据劫持:


vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,

通过Object.defineProperty()来劫持各个属性的settergetter

在数据变动时发布消息给订阅者,触发相应的监听回调。

 

相关文章:

【面试题】MVC、MVP与MVVM模式是什么?

MVC模式 MVC是应用最广泛的软件架构之一,一般MVC分为: Model( 模型 )、Controller( 控制器 )、View( 视图 )。 这主要是基于分层的目的,让彼此的职责分开。View 一般…...

网络安全02-C段扫描、开放端口

查询网站IP https://seo.chinaz.com/hetianlab.com 扫描指定IP:例:nmap -A -T4 ww.hetianlab.com -oX out.html 扫描指定段:例:nmap -O -Pn -A 192.168.113.1-200 扫描整个C段:例:nmap -O -Pn -A 192.168.…...

vscode流程图插件使用

vscode流程图插件使用 1.在vscode中点击左下角设置然后选择扩展。 2.在扩展中搜索Draw.io Integration,安装上面第一个插件。 3.安装插件后在工程中创建一个后缀为drawio的文件并且双击打开即可绘制流程图...

mysql数据导入导出参数说明

一、使用into outfile和load data infile导入导出备份数据 这种方法的好处是导出的数据格式可以自己规定,并且导出的是纯数据,不含建表信息。 1.into outfile导出 SELECT * FROM metadatakeys INTO OUTFILE D:/outfile.txt FIELDS TERMINATED BY | E…...

Qt——QLineEdit控件常见的属性、方法和信号

QLineEdit控件常见的属性、方法和信号 一、QLineEdit控件常见属性和方法 二、QLineEdit控件常见信号 QLineEdit:单行文本输入框控件 一、QLineEdit控件常用属性和方法: 1. text: 描述:获取或设置文本框中的文本内容。 用法&…...

C语言:指针和数组(看完拿捏指针和数组)

目录 数组名的理解: 一维数组: 解析: 字符数组: 解析: 解析: 字符串数组: 解析: 解析: 一级指针: 解析: 解析: 二维数组&a…...

Conda命令整理-自用版

Conda用法整理-自用版 Conda介绍1、环境操作1.1 创建环境1.2 激活环境1.3 导出环境1.4 导入环境1.5 关闭环境1.6 删除环境 2、包操作2.1 安装软件包2.2 安装指定包的指定版本 参考资料 Conda介绍 Conda是一个开源的包管理系统和环境管理器,用于在不同的计算环境中安…...

CountDownLatch 和 CyclicBarrier的区别与详解

文章目录 一.CountDownLatch 和 CyclicBarrier的区别二.详解总结用法CountDownLatch 用法CyclicBarrier 用法 一.CountDownLatch 和 CyclicBarrier的区别 CountDownLatch和CyclicBarrier都是线程同步的工具类,都是基于AQS实现的;CountDownLatch 的计数器…...

Vue子组件向父组件传值(this.$emit()方法)

子组件使用this.$emit()向父组件传值 首先必须在父组件中引用子组件,然后实现传值 第一步 在父组件中引入子组件 使用import引入组件 import indexImportOrder from ./components/indexImportOrder 声明 //定义组件components:{indexImportOrder,}, 使用 &l…...

【C++】C/C++内存管理-new、delete

文章目录 一、C/C内存分布二、C/C中动态内存管理方式2.1 C语言中动态内存管理方式2.2 C内存管理方式 三、operator new和operator delete函数3.1 operator new和operator delete函数3.2 operator new与operator delete的类专属重载(了解) 四、new和delet…...

高手进阶之路---pyqt自定义信号

高手进阶之路—pyqt自定义信号 1.思考问题为什么要自定义信号,qt5本身已有信号槽函数 # pushButton 被clicked的时候connect 函数print self.pushButton.clicked.connect(self.print)def print(self):print("我被点击了")或者使用 # 需要引入 pyqtSlo…...

研磨设计模式day09原型模式

目录 场景 代码实现 有何问题 解决方案 代码改造 模式讲解 原型与new 原型实例与克隆出来的实例 浅度克隆和深度克隆 原型模式的优缺点 思考 何时选用? 相关模式 场景 代码实现 定义订单接口 package com.zsp.bike.day08原型模式;/*** 订单的接口*…...

(二)Redis——List

因为是 List,所以所有相关的命令都以 L 开头。 LPUSH / RPUSH LRANGE list 0 -1 -1 表示末尾 127.0.0.1:6379> LPUSH list a 1 127.0.0.1:6379> LRANGE list 0 -1 a 127.0.0.1:6379> LPUSH list b 2 127.0.0.1:6379> LRANGE list 0 -1 b a 127.0.0.…...

【Go Web 篇】Go 语言进行 Web 开发:构建高性能网络应用

随着互联网的快速发展,Web 开发已经成为了软件开发领域中不可或缺的一部分。随之而来的是对于更高性能、更高效的网络应用的需求。在这个领域,Go 语言因其并发性能、简洁的语法以及丰富的标准库而备受关注。本篇博客将深入探讨如何使用 Go 语言进行 Web …...

开悟Optimization guide for intermediate tracks

目录 认识模型 参考方案(按模块拆解) 认识模型 模型控制1名英雄进行镜像1 v 1对战 Actor集群资源为64核CPU 问题特点:单一公平对抗场景(同英雄镜像对赛),单位时间样本产能低,累计训练资源相…...

wx.request配置服务器域名,只能包含英文大小写字母、数字,解决办法

前言.小程序服务器域名配置常见错误及解决方法 1.配置入口: 小程序后台->-开发->开发设置->服务器域名 2.常见错误及原因分析: 3.实战中出现的错误 4.解决办法:应把域名后边的路径去掉,只写域名即可...

【有效的括号】

题目 1、左括号入栈 2、右括号出栈顶括号进行匹配 栈 typedef char STDataType; //元素为char类型 typedef struct Stack {STDataType* a;//动态的开辟空间int top;int capacity; }ST;void StackInit(ST* ps)//初始化 {assert(ps);ps->a (STDataType*)malloc(sizeof(STD…...

积跬步至千里 || 数学基础、算法与编程

数学基础、算法与编程 1. BAP 技能 BAP 技能是指基础(Basic)、算法(Algorithm)和编程(Programm)三种基本技能的深度融合。理工科以数学、算法与编程为根基,这三个相辅相成又各有区别。 (1)数学以线性代数为主要研究工具和部分微积分技术为手…...

Java单元测试 JUnit 5 快速上手

一、背景 什么是 JUnit 5?首先就得聊下 Java 单元测试框架 JUnit,它与另一个框架 TestNG 占据了 Java领域里单元测试框架的主要市场,其中 JUnit 有着较长的发展历史和不断演进的丰富功能,备受大多数 Java 开发者的青睐。 而说到…...

【Linux网络】TCP UDP socket HTTP webSocket之间的区别

目录 一、OSI & TCP/IP模型 二、几者之间的关系 三、HTTP 四、Socket 五、WebSocket 5.1、WebSocket 优点 一、OSI & TCP/IP模型 首先我们要了解OSI七层模型,和预支对应的TCP/IP 四层的模型。 用下面的图可以看出,TCP UDP 工作在传输层&…...

你还在给每个图片父元素加类名?CSS :has() 让选择器“逆天改命”

你还在给每个图片父元素加类名?CSS :has() 让选择器“逆天改命” 引言 “组长,这个需求我写不了。” “什么需求?” “产品经理说,所有包含图片的卡片,要在卡片上加一个‘带图标识’的边框。但是这些卡片是动态渲染的&…...

避坑指南:Prescan8.5安装常见报错解决方案(含MATLAB集成配置)

Prescan8.5安装避坑指南:7类典型报错与MATLAB集成深度解析 当仿真工程师第一次打开Prescan8.5安装包时,很少有人能预料到接下来可能遭遇的"技术迷宫"。作为自动驾驶仿真领域的重要工具,Prescan的安装过程就像它的功能一样复杂——从…...

老码农和你一起学AI系列:ELECTRA

ELECTRA(Efficiently Learning an Encoder that Classifies Token Replacements Accurately)是Google Research在2020年提出的一种自监督预训练方法。它不像BERT那样做“完形填空”,而是让模型扮演一个“作弊检测员”,通过判别输入…...

K8s Ingress实战:如何为静态资源开启Gzip压缩和Cache Control(附完整ConfigMap配置)

Kubernetes Ingress高级配置:静态资源Gzip压缩与缓存策略实战指南 在当今快节奏的数字化体验中,网页加载速度直接影响用户留存率和转化率。根据行业研究,页面加载时间每增加1秒,可能导致转化率下降7%。作为Kubernetes运维专家&…...

QwQ-32B在ollama中的推理效果展示:数学定理推导、算法设计全过程

QwQ-32B在ollama中的推理效果展示:数学定理推导、算法设计全过程 1. 模型简介与部署准备 QwQ-32B是Qwen系列中专注于推理能力的语言模型,与传统指令调优模型相比,它在解决复杂问题和推理任务方面表现突出。这款中等规模模型拥有325亿参数&a…...

告别卡顿!用UE5关卡流送(Level Streaming)优化你的开放世界游戏性能

告别卡顿!用UE5关卡流送(Level Streaming)优化你的开放世界游戏性能 当玩家在广袤的开放世界中自由探索时,没有什么比突然的加载卡顿或帧率骤降更能破坏沉浸感了。作为UE5开发者,我们常常面临一个两难选择:…...

开源动作捕捉新纪元:FreeMoCap低成本解决方案全解析

开源动作捕捉新纪元:FreeMoCap低成本解决方案全解析 【免费下载链接】freemocap Free Motion Capture for Everyone 💀✨ 项目地址: https://gitcode.com/GitHub_Trending/fr/freemocap 问题:动作捕捉技术的高门槛困境 在数字内容创作…...

FedMeta: Accelerating Federated Learning with Meta-Learning for Enhanced Privacy and Efficiency

1. FedMeta:当联邦学习遇上元学习 想象一下,你正在训练一个能识别手写数字的AI模型,但数据分散在成千上万个用户的手机里。传统联邦学习就像让每个用户都从头开始训练完整模型,既耗流量又费时间。而FedMeta的聪明之处在于——它让…...

OFA模型微调实战:适配特定领域的小样本学习

OFA模型微调实战:适配特定领域的小样本学习 用最少的数据,让通用大模型听懂你的专业语言 1. 引言:当通用模型遇到专业领域 你有没有遇到过这样的情况:一个在通用场景下表现优秀的AI模型,一到你的专业领域就"水土…...

YOLOv8工业缺陷检测推理延迟骤降63%:基于TensorRT量化+ONNX Runtime定制化内核的完整链路

第一章:YOLOv8工业缺陷检测推理延迟骤降63%:基于TensorRT量化ONNX Runtime定制化内核的完整链路在高吞吐产线场景下,YOLOv8原生PyTorch模型在Jetson AGX Orin上单帧推理延迟达84.2ms(输入尺寸640640),严重制…...