架构模式:MVC

引言

MVC,即 Model(模型)-View(视图)-Controller(控制器),是广泛应用于交互式系统中的典型架构模式,尤其在 GUI 和 Web 应用中。

MVC 的概念源自 GOF(Gang of Four)的设计模式中的观察者模式(Observer Pattern),尽管 GOF 的经典设计模式中并未明确提出 MVC 这一术语。该概念由 Trygve Reenskaug 在 1979 年首次提出于其论文《Models-Views-Controllers》中。

MVC 架构通过将系统划分为三种关键组件,使其逻辑结构更清晰:

  • 模型(Model):管理应用程序的核心数据和业务逻辑,独立于视图和控制器,不关心数据的显示方式或如何被操作。
  • 视图(View):负责数据的呈现,通过从模型获取数据来展示给用户,不包含业务逻辑。
  • 控制器(Controller):处理用户输入,更新模型并通知视图以更新展示。

经典 MVC 的这种架构分离使得用户界面(视图和控制器)与核心数据(模型)解耦。本文探讨两种主流的 MVC 模式:经典 MVC 和 Web 应用中的 MVC Model 2 模式。

经典MVC

在经典 MVC 中,视图(View)是系统的中心,它负责发起事件请求。控制器(Controller)响应这些事件请求,更新模型(Model)。当模型发生变化时,它通过观察者模式通知视图,视图则自动更新。这种模型和视图之间的交互不需要控制器参与。
在这里插入图片描述
经典 MVC 主要应用于桌面应用程序中,因为它的观察者模式在本地环境中表现良好。但在 Web 应用中,视图和模型分别位于浏览器端和服务器端,这种模型观察的机制很难实现。因此,经典 MVC 在 Web 应用中的适用性受到限制。

尽管如此,经典 MVC 的分层设计及其使用的设计模式(观察者模式、组合模式、策略模式)至今仍具借鉴意义。

观察者模式

经典 MVC 使用观察者模式来实现主动模型(Active Model),即当模型发生变化时,自动通知视图进行更新。例如,在一个音乐播放应用中,当用户点击播放按钮,控制器通知模型播放音乐,模型可以通过观察者模式通知视图更新播放状态。

在简单场景中,模型可以是被动的(Passive Model),例如,控制器通知视图获取数据,模型则只作为数据持有者而不主动通知视图更新。

组合模式

View和Controlle通常是分层组织的,像树状结构的布局是其典型的实现。组合模式允许将复杂的视图结构拆解为简单的子视图,从而提高系统的可维护性和复用性。
在这里插入图片描述

策略模式

MVC 架构的另一重要特性是,可以在不修改视图的情况下改变系统的响应逻辑。控制器可以封装不同的响应策略,通过策略模式,系统可以动态切换控制器,调整用户输入的响应方式。

Web应用MVC:Model 2

Model 2 是为适应 Web 应用的特点而对经典 MVC 进行的改进,常用于 JSP 和类似的 Web 框架中。它采用了前端控制器模式(Front Controller Pattern),即所有用户请求首先由控制器处理,控制器负责调用模型和视图,生成用户所需的内容。
在这里插入图片描述
在Model2模式中,Controller是系统的核心,用户所有请求被 Controller 拦截(Front Controller模式,servlet / filter)。Controller 首先响应用户输入,并更新数据到Model组件,然后从Model获取需要的数据,并整合成 View 层需要的 Domain Objects(一般包含数据和业务逻辑,POJO / JavaBean)。随后,Controller 根据结果调用适当的 View 进行展示。

每个视图都有于此相关联的控制器组件。控制器接受用户输入,用户通过控制器与系统交互,控制接收到用户输入指令,首先操作Model实现数据更新,然后Controller通知View展示最新数据,View在展示过程中会与Model通信获取最新数据。

此模式下,View 和 Model 的部分可能有多种实现。一般倾向于单向互通(即View可直接获取Model)或间接互通。

例如,在一个电子商务网站中,用户在页面上进行商品搜索操作,请求首先被控制器(Servlet)拦截。控制器调用模型(数据库操作的 JavaBean)进行商品搜索,获取结果后将数据整合成视图需要的格式,然后调用相应的 JSP 视图页面展示搜索结果。用户可以在视图页面上进一步查看商品详情,视图页面会再次与模型通信获取商品的详细信息。

Java Web Model 2

Java Web Model 2是Model 2的典型范例,在Model 2构架中,Servlet作为前端控制器,负责接收客户端发送的请求,在Servlet中只包含控制逻辑和简单的前端处理;然后调用后端JavaBean来完成实际的逻辑处理;最后转发到相应的JSP页面处理显示逻辑。

在这里插入图片描述
Model2中,JSP是表现层角色,仅用于将结果呈现给用户。浏览器发来的请求与Servlet(控制器)交互,而Servlet负责与后台的JavaBean通信。模型(Model)由JavaBean充当,视图(View)有JSP页面充当,而控制器(Controller)则由Servlet充当。

优缺点

优点

低耦合性

视图层与业务层分离,使得更改视图层代码无需重新编译模型和控制器代码。同样,应用程序的业务流程或业务规则改变只需改动 MVC 的模型层。由于模型与控制器和视图相分离,改变应用程序的数据层和业务规则变得容易。

高重用性和可适用性

随着技术的不断进步,现在需要用越来越多的方式来访问应用程序。MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这些表示所需要的命令是改变视图层的实现方式,而控制层和模型层无需做任何改变。

较低的生命周期成本

MVC使开发和维护用户接口的技术含量降低。

快速的部署

使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

可维护性

分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

有利于软件工程化管理

由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。

缺点

复杂性

MVC 架构虽然提高了系统的模块化,但也带来了额外的复杂性,特别是在小型项目中,可能过于臃肿。

调试困难

由于视图、控制器和模型是相互独立的,调试时可能需要跨多个模块进行排查,增加了调试的难度。

总结

MVC 首次将心智模型与数字模型建立联系,同时将代码逻辑进行分层,将「渲染」「控制 / 分发」与数据存储进行有机分隔。此后,在涉及界面展示的编程领域,人们大概率会想到 MVC 的分隔方式并依此实现。因此,MVC 存在各种变种和通信方式,如 Backbone JS 中 View 和 Model 之间可以相互更改;Cocoa MVC 中 View 和 Controller 之间、Controller 和 Model 之间相互更改。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java设计模式之命令模式介绍和案例示范

一、命令模式简介 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为一个对象,从而使你可以用不同的请求对客户端进行参数化、对请求排队或记录日志,以及支持可撤销的操作。命令模式的核心思想是将发出请…

学习Vue3的第四天

目录 pinia 安装 Pinia 存储读取数据 修改数据(三种方式) storeToRefs getters $subscribe store组合式写法 组件通信 props 自定义事件 mitt v-model $attrs $refs、$parent provide、inject slot pinia Pinia 是一个用于 Vue.js 的状态管理库,作…

vue-i18n 使用 $t 导致的 Typescript 报错问题

目录 1&#xff0c;问题2&#xff0c;解决 1&#xff0c;问题 在 Vue3 项目中使用 vue-i18n v9.14.0 时&#xff0c;可以&#xff1a; <template><div>{{ t(xxx) }}</div> </template><script setup lang"ts"> import { useI18n } f…

顶踩Emlog插件源码

源码介绍 顶踩Emlog插件源码 前些天看到小刀娱乐网的文章页面有了一些变化&#xff0c;那就是增加了一个有价值/无价值的顶踩按钮。 样式也是非常的好看 再加上两个表情包是非常的有趣。 写到了Emlog系统&#xff0c;效果如上图。 如何使用&#xff1a; 需要在echo_log.…

Datasheet SHT20芯片的数据手册

Datasheet SHT20芯片的数据手册 I2C读取湿度传感器返回的16位数据。SCL SDA 14位有效&#xff0c;我以为是将后二位删除&#xff0c;实际上看完手册才知道是后二位值无用&#xff0c;不是删除&#xff0c;而是清0&#xff0c;实际上还是16为&#xff0c;知识后二位是0还是1&…

Flume 日志采集系统

Flume 日志采集系统 一、Flume 概述二、Flume 架构设计2.1 架构图2.2 Flume Source 类型2.3 Flume Channel 类型2.4 Flume Sink 类型 三、Flume 安装部署3.1 下载解压3.2 上传解压3.3 修改配置文件2.4 启动 Flume Agent 四、案例实践&#xff1a;Flume 分布式集群搭建4.1 Flume…

基于SpringBoot的准妈妈孕期交流平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;IDEA/Eclipse、Navicat 系统展示 首页 管理员登录 用户管理 早教…

利用CubeMX复现正点原子TFTLCD驱动例程

来源&#xff1a;正点原子 FMC的工作原理暂时先欠着&#xff0c;先记录一下CRUD的过程。 第一步准备一个us级别延时函数&#xff0c;不会的参考拙作&#xff1a;STM32的定时器简介-CSDN博客 第二部开启FMC外设&#xff1a; ①进入 Pinout->FMC 配置栏&#xff0c;配置 …

如何做好网络安全

随着互联网技术的飞速发展&#xff0c;网站已成为企业对外展示、交流和服务的重要窗口。然而&#xff0c;随之而来的网站安全问题也日益凸显&#xff0c;给企业的业务发展和用户数据安全带来了巨大威胁。因此&#xff0c;高度重视网站安全已成为网络安全的首要任务。今天我们就…

使用ffmpeg在视频中绘制矩形区域

由于项目需要对视频中的人脸做定位跟踪&#xff0c; 我先使用了人脸识别算法&#xff0c;对视频中的每个帧识别人脸、通过人脸库比对&#xff0c;最终记录坐标等信息。 然后使用ffmpeg中的 drawbox 滤镜功能&#xff0c;选择性的绘制区域。从而实现人脸定位跟踪 1、drawbox …

用于协作代码开发的 10 大 GitHub 集成

GitHub 是开发人员的天堂。开发人员在分布式 GitHub 存储库中存储和管理其源代码,允许多个贡献者同时处理项目。这种协作行动将生产力提高了 22%,将修复漏洞的速度提高了 7 倍,并将入职时间缩短了 80%。 作为一个版本控制系统,它允许开发人员跟踪和审查更改、管理分支和合…

【Sceneform-EQR】通过sceneform-eqr实现一个视频播放器(使用安卓MediaPlayer实现视频播放)

在前一篇文档中介绍了如何在AR\三维场景创建几种背景 【Sceneform-EQR】scenefrom-eqr中的几种背景实现(不仅用于AR、三维场景&#xff0c;在图片、视频播放器中也适用) 本文将侧重介绍如何使用安卓MediaPlayer实现视频播放。 ↓↓↓↓↓↓↓↓↓↓↓↓ 以下正文 ↓↓↓↓↓↓…

李彦宏内部讲话曝光,谈大模型三大认知误区:智能体还是非共识

“外界对大模型有相当多的误解&#xff0c;”近日据媒体报道&#xff0c;李彦宏的一则内部讲话曝光。在最近一次和员工交流中&#xff0c;李彦宏谈及三个大模型认知误区&#xff0c;涵盖了大模型竞争、开源模型效率、智能体趋势等热点话题。 李彦宏认为未来大模型之间的差距可…

DWI扩散磁共振成像和结构连接组学指南

扩散磁共振成像和结构连接组学指南 引言流程概述扩散磁共振成像(dMRI)dMRI基础ADC&#xff08; apparent diffusion coefficient, 表观扩散系数&#xff09;MD&#xff08;mean diffusivity, 平均扩散率&#xff09;FA&#xff08; fractional anisotropy, 分数各向异性&#x…

“左侧文字横向”的QTabWidget

左侧用 QToolButton 组&#xff0c; 右侧用 QStackedWidget&#xff0c;信号槽绑定切换页面 可定制化高 QButtonGroup* btnGp new QButtonGroup(this);btnGp->addButton(ui->btn1, 0);btnGp->addButton(ui->btn2, 1);btnGp->addButton(ui->btn3, 2);connect…

MongoDB的Map-Reduce操作与聚合管道操作的两个实例相互转换

一、插入集合 comment 的文档的内容 二、题目要求 将集合 comment 中的文档进行聚合操作&#xff0c;即将字段 state为1的文档查询出来&#xff0c;然后按字段 nickname 进行分组,最后计算出每个评论者的评论条数。 三、mapReduce 操作代码 db.comment.mapReduce(// Map函数&…

linux搭建深度学习平台

linux搭建深度学习平台&#xff08;Ubuntu&#xff09; /home/guangyao/anaconda3 我服务器的anaconda地址 ~/anaconda3 1 首先就是打开浏览器&#xff0c;我实验室的是火狐&#xff0c;搜索anaconda下载&#xff0c;找到下载目录&#xff0c;cd进去&#xff0c; 2安装 bas…

鸿蒙界面开发——组件(6):属性字符串(StyledString)文本输入

属性字符串StyledString/MutableStyledString MutableStyledString继承于StyledString&#xff0c;以下统一简称StyledString。 是功能强大的标记对象&#xff0c;可用于字符或段落级别设置文本样式。 通过将StyledString附加到文本组件&#xff0c; 可以通过多种方式更改文本…

爆改YOLOv8|利用SCConv改进yolov8-即轻量又涨点

1&#xff0c;本文介绍 SCConv&#xff08;空间和通道重构卷积&#xff09;是一种高效的卷积模块&#xff0c;旨在优化卷积神经网络&#xff08;CNN&#xff09;的性能&#xff0c;通过减少空间和通道的冗余来降低计算资源的消耗。该模块由两个核心组件构成&#xff1a; 空间重…

ELK在Linux上部署教程

Docker Compose搭建ELK Elasticsearch默认使用mmapfs目录来存储索引。操作系统默认的mmap计数太低可能导致内存不足&#xff0c;我们可以使用下面这条命令来增加内存 sysctl -w vm.max_map_count262144创建Elasticsearch数据挂载路径 mkdir -p /echola/elasticsearch/data对…