前端---对MVC MVP MVVM的理解

news2024/11/13 11:27:11

就需要从前端这些年的从无到有、从有到优的变迁过程讲一下。

1. Web1.0时代

在web1.0时代并没有前端的概念,开发一个web应用多数采用ASP.NET/Java/PHP编写,项目通常用多个aspx/jsp/php文件构成,每个文件中同时包含了HTML、CSS、JavaScript、c#/Java/PHP代码,系统整体架构可能是这样子的:

在这里插入图片描述
我们可以看到服务端是比较重的,有一块既在客户端又在服务端,jsp是在我们server端生成的,然后他调用我们的service获取数据,然后在jsp页面进行封装,最后再把html前端的代码混成一个直接返回给前端。
所以我们可以看到这种架构的模式比较简单,而且很快捷。
但是缺点也很明显:jsp代码难以维护(前端代码和后端代码是混在一起的,如果业务逻辑复杂一些这个代码应该是非常庞大的)

2. MVC开发模式

为了让开发更加的快捷,代码更容易维护,前后的职责更清晰一些(不要把代码混在一起),就衍生出来了MVC开发模式和框架,前端展示以模型的形式出现。典型的框架就是Spring、Structs、Hibernate。整体框架如图所示:
在这里插入图片描述
他们的目标就是把我们的视图、数据和业务逻辑控制分层,这样代码也就分层了。
使用这种分层架构、职责清晰,代码容易维护。但是这里的MVC仅限于后端,前后端形成了一定的分离,前端只完成了后端开发中的view层。
那时候的前端程序员只是写一些前端页面和少量的js代码进行交互,但是仅限于静态页面,没有数据,然后再把这个页面交给后端程序员,后端再拿模版语法对他进行动态化的改造。

但是这种模式也存在着一些问题:

  1. 前端页面开发效率不高(主要把图变成静态页面然后交给后端)
  2. 前后端职责不清

3. Web 2.0

自从Gmail的出现,ajax技术风靡全球,有了ajax之后,前后端的职责就更加清晰了。因为前端可以通过ajax与后端进行数据交互,因此整体的架构图就变成了下幅图:
在这里插入图片描述
通过ajax与后台服务器进行数据交互,前端开发人员只需要开发页面这部分内容,数据可由后台进行提供。而且ajax可以使页面实现部分刷新,减少了服务端负载和流量消耗,用户体验更好。这时候才有了专职的前端工程师。同时前端的类库也慢慢的发展,最著名的就是jQuery了。
当然此架构也存在一些问题:缺乏可行的开发模式承载更复杂的业务需求,页面内容都糅杂在一起,一旦应用规模增大就难以维护。因为前端的MVC也随之而来。

4.前后端分离后的架构演变–MVC、MVP、MVVM

1. MVC

前端的MVC与后端的类似,具备着View、Controller和Model

Model:负责保存应用逻辑,与后端数据进行同步(专门用来封装和处理数据的)
Controller:负责业务逻辑,根据用户行为对Model数据进行修改(专门来处理请求的,1.接收参数 2.调用service层代码 3.控制页面跳转)
View:负责视图展示,将model中的数据可视化出来 好处:奇强调责任分离,方便维护代码

三者形成了一个模型:
在这里插入图片描述
这样的模型在理论上是可行的,但是在开发的过程中并不会这么操作。因为开发过程不灵活,例如:一个小小的事件操作都必须经过这么一个流程,那么开发就不在便捷了。

在实际场景中,我们往往会看到另外一种模式,如图:
在这里插入图片描述
这种模式在开发中更加的灵活,backbone.js框架就是这种模式。

但是这种灵活可能导致严重的问题:

  1. 数据流混乱(数据再发生变化时不知道是谁变的,在做维护的时候找问题就不好查)
    在这里插入图片描述
  2. View比较庞大,但是Controller比较单薄(一些简单的数据监听,然后直接调用Model层的更改逻辑,可有可无):由于很多的开发者都会在view中写一些逻辑代码,逐渐的就导致view中的内容越来越庞大,而controller变得越来越单薄。

既然有了缺陷就会有变革,前端的变化中似乎少了MVP的这种模式,是因为Angular早早地将MVVM框架模式带入了前端,MVP模式虽然在前端开发模式中不常见,但是在安卓等原生开发中,开发者还是会考虑它的。

2.MVP

MVP模式与MVC很接近,P指的是presenter,我们可以理解为一个中间人,他负责着View和Model之间的数据流动,防止二者之间的直接交流,我们可以看一下图示:
在这里插入图片描述
我们可以看到presenter负责和Model进行双向交互,还和View进行双向交互。这种交互方式相对于MVC来说少了一些灵活,View变成了被动视图,并且本身变得很小。虽然他分离了View和Model,但是应用逐渐变大之后导致presenter的体积变大,难以维护。如果想解决这个问题,我们可以从MVVM的思想中找到答案。

3.MVVM(Model-View-ViewModel)

ViewModel可以理解成是Presenter的进阶版

M(model):专门来准备数据的
V(View):展示页面
VM(ViewModel):视图和模型(视图和模型的转换):他是DOM监听器,监听着页面dom节点的变化,当页面DOM节点发生改变的时候,数据也会发生对应的改变

在这里插入图片描述
双向绑定机制:

  • ViewModel通过实现一套数据响应式机制自动响应Model中数据的变化(绑定数据:当model数据发生变化的时候,对应的界面也会发生改变)
  • 同时ViewModel会实现一套更新策略自动将数据变化转换成视图更新(DOM监听器,监听着页面dom节点的变化,当页面DOM节点发生改变的时候,数据也会发生对应的改变)
  • 实现数据绑定的方法有多种,常见的有观察者模式和发布-订阅模式。

通过事件监听响应View中用户交互修改Model数据
这样在ViewModel中就减少了大量的DOM操作代码
MVVM在保持View和Model松耦合的同时,还减少了维护他们关系的代码,使用户专注于业务逻辑,兼顾开发效率和可维护性。

5.总结

  • 这反映了前端领域的发展进程,这三者都是框架模式,它们设计的目标都是为了分层:解决Model和Viev的耦合问题
  • MVC模式出现较早主要应用在后端,如Spring MVC、ASP.NET MVC等,在前端领域的早期也有应用,如Backbone.js,它的优点是分层清晰,缺点是数据流混乱,灵活性带来的维护性问题。
  • MVP模式在是MVC的进化形式,Presenter作为中间层负责MV通信,解决了两者耦合问题,但P层过于臃肿会导致维护问题。
    -MVVM模式在前端领城有广泛应用,它不仅解决MV耦合问题,还同时解决了维护两者映射关系的大量繁杂代码和DOM操作代码,在提高开发效率、可谈性同时还保持了优越的性能表现。

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

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

相关文章

SpringCloud之熔断监控HystrixDashboard和Turbine

SpringCloud之熔断监控HystrixDashboard和Turbine Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各 Hystrix Command的请求响应时间, 请求成功率等数据。但是只使用Hystrix Dashboard的话, 你只能看到单个应 …

chrome 插件开发入门

1. 介绍 Chrome 插件可用于在谷歌浏览器上控制当前页面的一些操作,可自主控制网页,提升效率。 平常我们可在谷歌应用商店中下载谷歌插件来增强浏览器功能,作为开发者,我们也可以自己开发一个浏览器插件来配合我们的日常学习工作…

【开源免费】基于SpringBoot+Vue.JS图书个性化推荐系统(JAVA毕业设计)

本文项目编号 T 015 ,文末自助获取源码 \color{red}{T015,文末自助获取源码} T015,文末自助获取源码 目录 一、系统介绍1.1 业务分析1.2 用例设计1.3 时序设计 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究…

linux系统中,计算两个文件的相对路径

realpath --relative-to/home/itheima/smartnic/smartinc/blocks/ruby/seanet_diamond/tb/parser/test_parser_top /home/itheima/smartnic/smartinc/corundum/fpga/lib/eth/lib/axis/rtl/axis_fifo.v 检验方式就是直接在当前路径下,把输出的路径复制一份&#xff0…

二叉树的层次遍历(10道)

&#xff08;写给未来遗忘的自己&#xff09; 102.二叉数的层序遍历&#xff08;从上到下&#xff09; 题目&#xff1a; 代码&#xff1a; class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> r…

H桥电路及其应用

一、H桥电路简介 H桥是一种电机驱动电路&#xff0c;通过四个开关元件构成“H”型的电流路径结构。该电路能够控制负载&#xff08;如直流电机&#xff09;的电流方向&#xff0c;从而实现电机正反转和速度调节。H桥广泛应用于需要方向控制的场合&#xff0c;尤其是机器人驱动…

Java小白一文讲清Java中集合相关的知识点(六)

接上篇 添加了第二个元素“php”字符串后&#xff0c;debug查看此时的table的空间具体存储情况如下&#xff1a; 于是其将第二个待存放的元素“php”映射放入了9号索引处&#xff1b;接下来我们分析添加第三个重复元素“java”再次尝试放进去时&#xff0c;底层发生的一系列动…

13款常用AI编程工具

AI编程工具的选择和使用&#xff0c;主要取决于具体的项目需求、编程语言、以及AI任务的类型&#xff08;如机器学习、自然语言处理、计算机视觉等&#xff09;。下面是一些广泛使用的AI编程工具合集&#xff0c;涵盖了从开发、训练、到部署的各个环节&#xff1a; Jupyter Not…

Signac R|如何合并多个 Seurat 对象 (2)

引言 在本文中演示了如何合并包含单细胞染色质数据的多个 Seurat 对象。为了进行演示&#xff0c;将使用 10x Genomics 提供的四个 scATAC-seq PBMC 数据集&#xff1a; 500-cell PBMC 1k-cell PBMC 5k-cell PBMC 10k-cell PBMC 构建数据对象 接下来&#xff0c;将利用已经量化…

【计算机网络】socket编程 几个网络命令

目录 理解端口号理解源ip地址与目的IP地址认识端口号理解端口号与pid关系 理解socket编程理解网络字节序socket编程接口常见的API创建socket套接字bind绑定套接字listen开始监听accept接收请求connect建立连接recvfrom接收数据sendto发送数据 sockaddr结构sockaddr底层结构sock…

【C++】中动态链接库和静态链接库的区别

1. C 中动态链接库和静态链接库的区别 在C编程中&#xff0c;动态链接库&#xff08;Dynamic Link Library, DLL&#xff09;和静态链接库&#xff08;Static Library&#xff09;都是用来组织和重用代码的方法&#xff0c;但它们之间有几个重要的区别&#xff1a; 1.1 动态链…

【vite-plugin-vue-layouts】关于 vue-layouts 布局插件的使用和注意事项

环境&#xff1a;vue3 vuetify3 unplugin-vue-router 是怎么创建这个项目的&#xff1a; 选择它推荐的设置&#xff08;Recommend&#xff09; 问题描述 代码结构 # App.vue <template><v-app> <AppNavigator /> <RouterView /><AppFooter />…

多语言融合,全栈操控Vue + Spring Boot + SQL Server + Python部署到Windows服务器!

将一个包含Vue前端、Spring Boot后端、SQL Server数据库和Python脚本的项目部署到Windows服务器上涉及多个步骤。以下是一个详细的指南&#xff0c;帮助您完成这一过程。 前言 你是否正在寻找将Vue, Spring Boot, SQL Server和Python完美融合&#xff0c;并顺利部署到Windows服…

实时渲染技术的崛起:游戏与实时交互的新篇章

随着科技的飞速发展&#xff0c;实时渲染技术正逐步成为游戏与实时交互领域的重要驱动力。这一技术的崛起不仅极大地提升了用户体验&#xff0c;还推动了游戏、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等多个行业的创新发展。实时渲染技术开启…

PHP轻量级高性能HTTP服务框架 - webman

摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构&#xff0c;提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站&#xff0c;也可以开发 HTTP 接口或者微服务。 除此之外&#xff0c;webman 还支持自定义进程&am…

log4j 同一线程隔离classloader下MDC信息不同问题解决 ThreadLocal问题分析

最近遇到日志文件记录错误的问题。一个任务的日志信息会被莫名的拆分到两个不同目录中。且有一个目录还是曾经执行过的任务的目录。经过分析&#xff0c;首先怀疑的是MDC没有清理的问题&#xff0c;这也是最直观的问题。因为任务是在线程池(fixedThreadPool)中运行的。由于线程…

C#游戏服务器开发框架设计与架构详解

我一直在思考一个问题&#xff0c;什么样的服务端框架最好用&#xff0c;最适合? 经过这些年的项目经验&#xff0c;其实最好用&#xff0c;最适合的游戏服务端框架就是自己结合公司项目需求,团队特点与技术能力,自己整合的游戏框架是最好用的。 很多新手会担心自己整合的框架…

Java项目: 基于SpringBoot+mysql+maven房屋租赁系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven房屋租赁系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

XSS 漏洞检测与利用全解析:守护网络安全的关键洞察

在网络安全领域&#xff0c;跨站脚本攻击&#xff08;XSS&#xff09;是一种常见的安全漏洞。XSS 漏洞可以让攻击者在受害者的浏览器中执行恶意脚本&#xff0c;从而窃取用户的敏感信息、篡改页面内容或者进行其他恶意操作。本文将介绍 XSS 漏洞的检测和利用方法。 一、XSS 漏洞…

DYNA4技术分享系列:DYNA4在底盘域的应用

在汽车行业波澜壮阔的电动化、数字化与智能化浪潮中&#xff0c;底盘技术正经历着前所未有的蜕变&#xff0c;从传统的坚固基石跃升为集电动驱动与智能操控于一体的核心灵魂。智能底盘控制系统&#xff0c;正引领着汽车底盘技术迈向新时代的巅峰&#xff0c;其智能化程度已成为…