架构模式: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 之间相互更改。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web安全之GroovyShell讲解:错误与正确示范,安全问题与解决方案

第一章、引言 Groovy 是一门基于 Java 虚拟机(JVM)的动态语言,而 GroovyShell 是 Groovy 提供的一个灵活强大的脚本执行工具。通过 GroovyShell,开发者可以在运行时动态执行 Groovy 脚本,它的灵活性非常适合那些需要动…

多层建筑能源参数化模型和城市冠层模型的区别

多层建筑能源参数化(Multi-layer Building Energy Parameterization, BEP)模型和城市冠层模型(Urban Canopy Model, UCM)都是用于模拟城市环境中能量交换和微气候的数值模型,但它们的侧重点和应用场景有所不同。以下是…

MongoDB事务机制

事务机制 1.事务概念 在对数据的操作的过程中,涉及到一连串的操作,这些操作如果失败,会导致我们的数据部分变化了,部分没变化。这个过程就好比如你去吃早餐,你点完餐了,并且吃完早餐了,没付钱你…

【文件包含】——日志文件注入

改变的确很难,但结果值得冒险 本文主要根据做题内容的总结,如有错误之处,还请各位师傅指正 一.伪协议的失效 当我们做到关于文件包含的题目时,常用思路其实就是使用伪协议(php:filter,data,inpput等等)执行…

职业技能大赛背景下的移动互联网应用软件开发(Android)实训室建设方案

一、建设背景 随着科技的持续进步,移动设备已成为人们日常生活中不可或缺的一部分。据相关数据,移动互联网的使用率在近年来显著上升。在这样的背景下,移动互联技术不仅推动了科技的发展,也渗透到了智能家居、车联网、工业自动化…

TESSY创建需要手写桩的测试用例

如果需要让桩函数有额外的功能,如:传参检测、局部数据处理、多传参检测、函数实现变更等,可以进行手写桩。 我们以tessy5.1 IDE为例,给大家展示编写一个需要手写桩的测试用例过程。 1、前期的准备工作 可以参考以下文章&#xff1…

Qt常用控件——QTextEdit

文章目录 QTextEdit核心属性和信号同步显示示例信号示例 QTextEdit核心属性和信号 QTextEdit表示多行输入框,是一个富文本和markdown编辑器,并且能在内存超出编辑框范围时自动提供滚动条。 QPlainTexEdit是纯文本,QTextEdit不仅表示纯文本&a…

记得忘记密码情况下如何退出苹果Apple ID

在日常使用苹果手机时,我们可能会遇到需要退出Apple ID的情况,比如更换手机、不再使用某些服务或出于安全考虑等。下面,我们就来详细介绍一下苹果手机如何退出Apple ID。 情况一:记得Apple ID密码 若是记得Apple ID密码&#xff…

Tomcat服务详解

一、部署Tomcat服务器 JDK安装官方网址:https://www.oracle.com/cn/java Tomcat安装官方网址:Apache Tomcat - Welcome! 安装JDK 1.获取安装包 wget https://download.oracle.com/otn/java/jdk/8u411-b09/43d62d619be4e416215729597d70b8ac/jdk-8u41…

透明任务栏怎么设置?Windows电脑任务栏透明效果(详尽指南)

电脑任务栏可以自定义调整透明度,在Windows10和Windows11系统中,任务栏透明是默认不透明的。如果想要设置任务栏透明度,那么推荐以下方法实现,简单三个步骤即可实现,一起来看看吧! 第一步、选择合适的任务栏…

基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)

拖动前播放位置: 拖动后播放位置: 在Slider组件中,添加onChange方法进行监听,当视频轨道拖放结束时,触发this.seekTo()函数,其中seekTo函数需要传递一个视频已播放时长作为参数 Slider({ value: this.p…

【iOS】push和present的区别

【iOS】push和present的区别 文章目录 【iOS】push和present的区别前言pushpop presentdismiss简单小demo来展示dismiss和presentdismiss多级 push和present的区别区别相同点 前言 在iOS开发中,我们经常性的会用到界面的一个切换的问题,这里我们需要理清…

【专题】2024年8月医药行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p37621 在科技飞速发展的当今时代,医药行业作为关乎人类生命健康的重要领域,正处于前所未有的变革浪潮之中。数智医疗服务的崛起,为医疗模式带来了全新的转变,开启了医疗服务的新时代。…

SQL超时的常见原因和解决思路

目录 1. SQL超时的常见原因2. 解决思路2.1. 优化SQL查询2.2. 处理锁竞争2.3. 网络和连接配置2.4. 资源监控与调整 3. 预防措施4. 示例:设置SQL超时5. 总结 SQL超时问题常常会影响应用程序的性能和用户体验,了解和处理SQL超时的思路非常重要。以下是一些常…

【Oracle篇】全面理解优化器和SQL语句的解析步骤(含执行计划的详细分析和四种查看方式)(第二篇,总共七篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

干部画像系统的意义

干部画像系统是一个高度集成且功能丰富的管理工具,在干部管理、选拔、培养和评价等多个方面发挥着重要作用。显著提升干部管理工作的科学性、准确性和效率性。干部画像系统的意义主要包括: 1、增强干部选拔的精准性 干部画像系统通过全面收集和分析干部…

第15-05章:获取运行时类的完整结构

我的后端学习大纲 我的Java学习大纲 6.1.第一组方法API: 1.API列表:java.lang.Class 类: 2.代码测试: public class ReflectionUtils{ puvblic static void main(String[] args){}// 第一组Testpublic void api_01{//上面截图的代码......…

下载 llama2-7b-hf 全流程【小白踩坑记录】

1、文件转换 在官网 https://ai.meta.com/llama/ 申请一个账号,选择要下载的模型,会收到一个邮件,邮件中介绍了下载方法 执行命令 git clone https://github.com/meta-llama/llama.git​ ,然后执行 llama/download.sh&#xff0c…

IP地址是怎么实现HTTPS访问的?

首先,需要明确的是,IP地址(Internet Protocol Address)是互联网上设备(如服务器、路由器等)的唯一标识符,它允许数据包在网络中正确地路由和传输。然而,IP地址本身并不直接支持HTTPS…

可测试,可维护,可移植:上位机软件分层设计的重要性

互联网中,软件工程师岗位会分前端工程师,后端工程师。这是由于互联网软件规模庞大,从业人员众多。前后端分别根据各自需求发展不一样的技术栈。那么上位机软件呢?它规模小,通常一个人就能开发一个项目。它还有必要分前…