JavaRush /Java 博客 /Random-ZH /第 7 部分:MVC(模型-视图-控制器)模式简介

第 7 部分:MVC(模型-视图-控制器)模式简介

已在 Random-ZH 群组中发布
本材料是“企业发展概论”系列的一部分。上一篇文章: 第 7 部分:MVC(模型-视图-控制器)模式简介 - 1在本材料中,我们将向您介绍 MVC 这样的东西。让我们谈谈什么是 MVC,了解它的创建历史,了解 MVC 固有的主要思想和概念,逐步考虑如何将应用程序分解为模型、视图、控制器模块,并在其中编写一个小型 Web 应用程序Spring-Boot,并以Spring-MVC为例,让我们看看数据是如何从Java代码传输到html页面的。要理解这些材料,您需要熟悉设计模式,尤其是观察者和外观。熟悉HTTP请求和响应,了解html的基础知识,知道Java中的注释是什么。坐下来,泡茶,准备甜点、沙拉、主菜和第一道菜。我们开始。

MVC 的历史

MVC 的想法是由 Trygve Reenskaug 于 70 年代末在 Xerox PARC 工作时提出的。在那些日子里,如果没有学位和对大量文档的不断研究,就不可能使用计算机。Reenskaug 与一群非常强大的开发人员一起解决的问题是简化普通用户与计算机的交互。有必要创建一种工具,一方面极其简单易懂,另一方面能够管理计算机和复杂的应用程序。Reenskaug 曾在 Alan Kay 领导下的团队中工作,该团队开发了“适合所有年龄段儿童”的便携式计算机 - Dynabook 以及 SmallTalk 语言。就在那时,友好界面的概念被确立。Reenskaug 与他的团队的合作极大地影响了 IT 领域的发展。让我们介绍一个有趣的事实,它与 MVC 没有直接关系,但说明了这些发展的重要性。2007 年,苹果 iPhone 发布后,艾伦·凯 (Alan Kay) 说道:“麦金塔电脑问世时,《新闻周刊》问我对此有何看法。我说:这是第一台值得批评的个人电脑。演讲结束后,史蒂夫·乔布斯上前问道:iPhone值得批评吗?我说,把它做成五乘八英寸,你就能征服世界。” 三年后,2010 年 1 月 27 日,苹果推出了 9.7 英寸 iPad。也就是说,史蒂夫·乔布斯几乎完全遵循了艾伦·凯的建议。Rennskaug 从事的项目持续了 10 年。又过了 10 年,其创建者第一个关于 MVC 的出版物出版了。Martin Fowler 是许多有关软件架构的书籍和文章的作者,他提到他是从 SmallTalk 的工作版本中学习 MVC 的。由于很长一段时间没有从主要来源获得有关 MVC 的信息,以及由于许多其他原因,出现了对此概念的大量不同解释。因此,很多人认为MVC是一种设计方案或模式。不太常见的是,MVC 称为复合模式或协同工作以实现复杂应用程序的多种模式的组合。但事实上,正如前面所说,MVC 主要是一组架构思想/原则/方法,可以使用各种模式以各种方式实现......接下来,我们将尝试看看 MVC 概念中嵌入的主要思想。

什么是MVC:基本思想和原则

  • VC是一套用于构建具有用户界面的复杂信息系统的架构思想和原则;
  • MVC 是模型-视图-控制器的缩写。
免责声明:MVC 不是一种设计模式。MVC 正是一套用于构建具有用户界面的复杂系统的架构思想和原则。但为了方便,以免每次都重复:“一套架构思想……”,我们将MVC称为模式。让我们从简单的事情开始。模型-视图-控制器这几个词背后隐藏着什么?当开发具有用户界面的系统时,遵循 MVC 模式,您需要将系统分为三个组件。这些又可以称为模块或组件。说出你想说的话,但除以三。每个组件都有其自己的用途。 模型。第一个组件/模块是所谓的模型。它包含应用程序的所有业务逻辑。 看法。系统的第二部分是视图。该模块负责向用户显示数据。用户看到的一切都是由视图生成的。 控制器。该链中的第三个环节是控制器。它存储负责处理用户操作的代码(系统中的任何用户操作都在控制器中处理)。模型是系统中最独立的部分。如此独立以至于它不应该知道有关视图和控制器模块的任何信息。该模型是如此独立,以至于其开发人员可能对视图和控制器几乎一无所知。视图的主要目的是以用户友好的格式提供来自模型的信息。视图的主要限制是它不应该以任何方式更改模型。控制器的主要目的是处理用户操作。用户通过控制器对模型进行更改。更准确地说,是存储在模型中的数据。让我们再次给出讲座中已经向大家展示的图表: 第 7 部分:MVC(模型-视图-控制器)模式简介 - 2从这一切我们可以得出一个完全合乎逻辑的结论。一个复杂的系统需要划分为多个模块。让我们简要描述一下如何实现这种分离的步骤。

步骤 1:将应用程序的业务逻辑与用户界面分离

MVC 的关键思想是,任何具有用户界面的应用程序都可以粗略地分为 2 个模块:负责实现应用程序业务逻辑的模块和用户界面。第一个模块将实现应用程序的主要功能。该模块将是系统的核心,在其中实现应用领域模型。在MVC概念中,这个模块将是我们的字母M,即 模型。第二个模块将实现整个用户界面,包括向用户显示数据以及用户与应用程序交互的逻辑。这种分离的主要目的是保证系统的核心(MVC术语中的模型)可以独立开发和测试。这样划分后的应用架构会是这样的: 第 7 部分:MVC(模型-视图-控制器)模式简介 - 3

步骤 2. 使用观察者模式,实现模型更大的独立性以及用户界面的同步

在这里我们追求两个目标:
  1. 实现模型更大的独立性。
  2. 同步用户界面。
以下示例将帮助您了解同步用户界面的含义。假设我们在线购买电影票并查看剧院的可用座位数。其他人可以和我们同时购买电影票。如果有人在我们之前买票,我们希望看到我们会议的可用座位数量减少。现在让我们考虑一下如何在程序中实现这一点。假设我们有一个系统核心(我们的模型)和一个界面(我们进行购买的网页)。在网站上,2 位用户同时选择座位。第一个用户买了票。第二个用户需要在页面上显示此信息。这应该如何发生?如果我们从系统内核更新接口,我们的内核、我们的模型将依赖于接口。在开发和测试模型时,您必须记住更新界面的各种方法。为了实现这一点,您需要实现观察者模式。在它的帮助下,该模型可以向所有订阅者发送有关更改的通知。该接口作为这样的订阅者,将接收通知并更新。观察者模式一方面允许模型通知界面(视图和控制器)其中发生了变化,另一方面实际上对它们“一无所知”,从而保持独立。另一方面,这将允许用户界面同步。

步骤3.将界面分为View和Controller

我们继续将应用程序划分为模块,但处于层次结构的较低级别。在此步骤中,用户界面(在步骤 1 中被分成单独的模块)被分为视图和控制器。在视图和控制器之间划出严格的界限是很困难的。如果说视图是用户看到的东西,而控制器是用户与系统交互的机制,那就有些矛盾了。控件(例如网页上的按钮或电话屏幕上的虚拟键盘)本质上是控制器的一部分。但它们与视图的任何部分一样对用户可见。这里我们更多地讨论一下功能划分。用户界面的主要任务是确保用户与系统的交互。这意味着该接口只有2个功能:
  • 向用户展示并方便地展示系统的相关信息;
  • 将用户数据和命令输入系统(将其传输到系统);
这些功能决定了界面应如何划分为模块。结果,系统架构如下所示: 第 7 部分:MVC(模型-视图-控制器)模式简介 - 4因此,我们有一个由模型、视图和控制器三个模块组成的应用程序。总结一下:
  1. 按照MVC的原则,系统需要进行模块划分。
  2. 最重要、最独立的模块应该是模型。
  3. 模型是系统的核心。您需要能够独立于界面来开发和测试它。
  4. 为此,在系统隔离的第一步,您需要将其划分为模型和接口。
  5. 接下来,使用观察者模式,我们增强了模型的独立性并获得了用户界面的同步。
  6. 第三步,将界面分为控制器和视图。
  7. 将用户的信息输入系统所需的全部工作就是输入控制器。
  8. 所有从系统向用户输出信息的部分都在视图中。
还有一件更重要的事情要讨论,你可以喝可可。

一点关于View、Controller和Model之间的关系

当用户通过控制器输入信息时,他从而对模型进行更改。至少用户对模型数据进行了更改。当用户通过界面元素(通过视图)接收信息时,用户接收有关模型数据的信息。这是怎么发生的?视图和控制器如何与模型交互?毕竟View类不能直接使用Model类的方法来读写数据,否则就不存在Model的任何独立性问题。模型代表一组紧密互连的类,以一种好的方式,视图和控制器都不应访问这些类。为了连接Model与View和Controller,需要实现Facade设计模式。模型外观将是模型和界面之间的一层,视图通过它以方便的格式接收数据,控制器通过调用必要的外观方法来更改数据。概括地说,最终一切都会像这样: 第 7 部分:MVC(模型-视图-控制器)模式简介 - 6

MVC:有什么好处?

遵循 MVC 原则的主要目标是将应用程序的业务逻辑(模型)的实现与其可视化(视图)分开。这种分离将增加代码的重用。在用户需要以不同形式提供相同数据的情况下,使用 MVC 的好处最为明显。例如,以表格、图表或图表的形式(使用不同的类型)。同时,在不影响视图实现的情况下,您可以更改对用户操作(单击按钮、输入数据)的反应。如果遵循MVC的原则,就可以简化程序的编写,增加代码的可读性,也使得以后系统的扩展和维护变得更加容易。在《企业开发入门》系列的最后一个材料中,我们将以Spring-MVC为例来看看MVC的实现。 第 8 部分:在 spring-boot 中编写一个小应用程序
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION