架构模式:MVC

news2024/11/16 13:48:20

引言

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.coloradmin.cn/o/2117005.html

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

相关文章

JS解密工具之**如何续期 Charles 的 SSL 证书**

本文由 jsjiami加密/一键JS解密 独家赞助 有问题请私聊加密官方客服 Charles 是一款常用的 HTTP 代理工具,用于调试网络请求。然而,Charles 的 SSL 证书会定期过期,如果 SSL 证书失效,你将无法对 HTTPS 请求进行抓包。本文将详细…

SQL语句中in条件超过1000怎么办?

博客主页: 南来_北往 系列专栏:Spring Boot实战 引言 当遇到SQL语句中IN条件超过1000个的情况时,可以采取以下几种策略来有效处理这一问题: 使用临时表:将IN列表中的值存储在临时表中,并将该临时表与查询表进行J…

【Python 千题 —— 算法篇】寻找最长回文子串

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 回文串是指一个字符串从左到右和从右到左读都是一样的。寻找一个字符串中的最长回文子串是许多经典算法问题之一,广泛应…

2024年9月最新界面:自己如何在电脑上注册新的Google谷歌账号,图文详解和关键点解析、常见问题

有一些朋友需要通过谷歌账号来工作、学习或娱乐(例如很多游戏需要用谷歌账号来注册和使用),但是不知道如何注册谷歌账号,或者知道如何注册,但是对于一些步骤或者注意事项不太熟悉,导致注册不成功&#xff0…

什么是LED智能会议一体机?COB超微小间距LED会议一体机大势所趋

LED智能会议一体机,作为现代会议室革新的核心装备,正逐步颠覆传统会议模式的界限。它不仅仅是一台集成了高清显示、触控互动、音视频处理及远程协作等功能于一体的智能设备,更是推动会议效率与体验双重飞跃的关键力量。随着技术的不断进步&am…

【重学 MySQL】十八、逻辑运算符的使用

【重学 MySQL】十八、逻辑运算符的使用 AND运算符OR运算符NOT运算符异或运算符使用 XOR 关键字使用 BIT_XOR() 函数注意事项 注意事项 在MySQL中,逻辑运算符是构建复杂查询语句的重要工具,它们用于处理布尔类型的数据,进行逻辑判断和组合条件…

【Protobuf】初识protobuf以及详细安装教程

W...Y的主页 😊 代码仓库分享 💕 目录 序列化概念 ProtoBuf是什么 ProtoBuf在window下的安装 下载ProtoBuf编译器 配置环境变量 ​编辑 检查是否配置成功 ​编辑 ProtoBuf在Linux下的安装 下载ProtoBuf 安装ProtoBuf 序列化概念 首先我们…

小白开发中遇到的问题和解决方案

小白开发中遇到的问题和解决方案 文章目录 小白开发中遇到的问题和解决方案问题一 问题一 问题:端口别占用可能开开启多个应用 解决方法–在cmd执行下方红框中的命令关闭所有应用

MyBatis-MappedStatement什么时候生成?QueryWrapper如何做到动态生成了SQL?

通过XML配置的MappedStatement 这部分MappedStatement主要是由MybatisXMLMapperBuilder进行解析,核心逻辑如下: 通过注解配置的MappedStatement 核心逻辑就在这个里面了: 继承BaseMapper的MappedStatement 我们看看这个类,里…

idea如何配置模板

配置生成代码指令模板 注:我们常用的有sout,main等指令 第一步打开设置面板 1)按如下操作 2)或者CtrlAltS快捷键直接弹出 第二步找 Editor>LiveTemplates 如下图 第三步创建模板 步骤如下 1)创建分组名字 2)分组名字 3)创…

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

pycharm如何安装selenium

在pycharm中打开一个项目后,点击Setting(ALTCtrlS快捷键) 然后点击install package完成后点击关闭这个窗口,就可以在代码中使用selenium了 成功后出现如下界面 编写一段正常可以运行操作chorme浏览器的 from selenium import webdriver # 指定ChromeDriver的路径driver we…

关于 PC打开“我的电脑”后有一些快捷如腾讯视频、百度网盘、夸克网盘、迅雷等各种捷方式在磁盘驱动器上面统一删除 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142029325 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

淘宝开放平台交易类API解析以及如何测试?

调用淘宝开放平台的订单接口,主要可以通过以下几种途径进行: 1. 直接使用淘宝开放平台提供的API接口 步骤概述: 注册淘宝开放平台账号:首先,你需要在淘宝开放平台注册一个开发者账号。创建应用:在注册并…

Unity3D 小案例 像素贪吃蛇 01 蛇的移动

Unity3D 小案例 像素贪吃蛇 第一期 蛇的移动 像素贪吃蛇 今天来简单制作一个小案例,经典的像素贪吃蛇。 准备 首先调整一下相机的设置,这里使用灰色的纯色背景,正交视图。 接着,创建一个正方形,保存为预制体&#…

位运算技巧总结

一、常见位运算操作 1、基础位运算 & 按位与 有0则0 | 按位或 有1则1 ^ 按位异或 相同为0 不同为1 2、确定数n的二进制位中第x位是0还是1 目的:是0返回0,是1返回1 (n >> x) & 1 思路:1除了第一位其他位都是0&a…

01初识FreeRTOS【前情回顾篇】

为什么要使用FreeRTOS? 裸机轮询无法避免两个函数相互影响的问题,例如我们使用单片机在进行裸机开发时,我们使用了Delay延时函数,这时我们无法再执行其他的功能代码,需要等延时时间结束再执行其他代码,而使…

通过域名无法访问不到网站,IP可正常访问(DNS污染)

一 DNS被污染 就在刚刚突然访问不到csdn,域名无法访问如下图: 确认DNS是否解析有问题 1 ping 域名 先ping一下域名,ping 域名后得到ip, ping通了如下图: 2 使用IP访问测试 通过ip再访问网站,ip可以正常访问如下图&…

nginx搭配gateway的集群配置

一、nginx在http里配置如下信息 upstream gateway-cluster {server 127.0.0.1:10001;server 127.0.0.1:10002;}server {listen 1000;server_name localhost;location ~/zzw_project/(.*) {proxy_pass http://gateway-cluster/$1;proxy_set_header Host $host; # 代理设…

延迟渲染路径

1. 延迟渲染路径处理光照的方式 延迟渲染路径对光照的数量没有任何限制,并且所有灯光都可以采用逐像素渲染。理论上来说,即 使场景中有成百上千个实时灯光,依然可以保持比较流畅的渲染帧率。它支持法线纹理、阴影等等效果的处理;…