本材料属于"企业发展导论"系列。之前文章:

在本文中,我们将了解一种叫做MVC的东西。我们将讨论什么是MVC,介绍其历史,探讨MVC中体现的基本理念和概念,逐步了解如何将应用拆分为模型模块、视图模块和控制器模块,使用Spring Boot编写一个小型网页应用,并以Spring MVC为例,了解数据如何从Java代码传输到HTML页面。 要理解这些材料,你需要熟悉设计模式,尤其是观察者和立面。熟悉HTTP请求和响应,了解HTML基础知识,并了解Java注释是什么。 拿杯咖啡和零食,放松一下。我们开始吧。
MVC的历史
MVC的理念由特里格维·雷恩斯考格在1970年代末于施乐帕洛阿尔克研究中心工作时提出。那时,操作计算机需要学位和不断研读大量文献。 Reenskaug 与一组非常优秀的开发者共同完成的任务是简化普通用户与计算机的交互。有必要创造一方面极其简单易懂的工具,另一方面又能使计算机和复杂应用能够控制。 Reenskaug曾参与开发"适合各年龄段儿童"的笔记本电脑团队------Dynabook,以及由Alan Kay领导的SmallTalk语言。 那时,友好界面的概念被确立了。在许多方面,Reenskaug及其团队的工作影响了IT领域的发展。 这里有一个有趣的事实,虽然不直接适用于MVC,但说明了这些发展的重要性。 艾伦·凯说:"当我第一次接触苹果时,是在1984年,Mac已经上市,《新闻周刊》联系我,问我对Mac的看法。我说,'Mac是第一台足够好、值得被批评的个人电脑。'所以,在2007年宣布iPhone后,他把它拿给了我,并递给了我。他说,'艾伦,这部电影好到值得批评吗?'我说,'史蒂夫,把它做成像平板电脑那么大,你就能统治世界。'" 三年后,2010年1月27日,苹果推出了9.7英寸对角线的iPad。换句话说,史蒂夫·乔布斯几乎完全遵循了艾伦·凯的建议。 Reenskaug的项目持续了10年。但关于MVC的第一篇出版物是在又过了十年后才曝光的。Martin Fowler,多本软件架构书籍和文章的作者,提到他是用Smalltalk的一个可工作版本学习MVC。 由于长期没有关于MVC的原始资料,以及其他多种原因,这一概念出现了大量不同的解释。 因此,许多人认为MVC是一种设计模式。较少见的是,MVC被称为复合模式,或是多个模式的组合,协同工作以创建复杂的应用程序。 但如前所述,MVC实际上主要是一套架构理念/原则/方法,可以用不同的模式以多种方式实现...... 接下来,我们将探讨MVC概念中蕴含的主要思想。

MVC:基本理念与原则
- VC是一套用于构建具有用户界面的复杂信息系统的架构理念和原则
- MVC 是 Model-View-Controller 的缩写
免责声明:MVC不是设计模式。MVC 是一套用于构建具有用户界面的复杂系统的架构理念和原则。但为了方便起见,为了避免反复说"一组建筑理念......",我们会参考MVC模式。 先从简单的开始。"模型-视图-控制器"这两个词背后隐藏着什么? 在使用MVC模式开发带有用户界面的系统时,你需要将系统划分为三个部分。它们也可以被称为模块或组件。你可以怎么称呼它们,但要把系统分成三个部分。每个组件都有其用途。模特。第一个组件/模块称为模型。它包含了应用的所有业务逻辑。View。系统的第二部分是视野。该模块负责向用户显示数据。用户看到的所有内容都是由视图生成的。控制者。这条链的第三环是控制器。它包含负责处理用户操作的代码(所有用户操作都在控制器中处理)。 模型是系统中最独立的部分。独立到它对视图和控制器模块一无所知。该模型非常独立,开发者几乎对视角和控制器一无所知。 视图的主要目的是以用户可接受的格式提供模型信息。该观点的主要限制是不能以任何方式改变模型。 控制器的主要作用是处理用户操作。用户通过控制器对模型进行修改。更准确地说,是对存储在模型中的数据。 这是你之前在课程中看到的示意图:从这些中,我们可以得出一个合乎逻辑的结论。复杂的系统需要被划分为模块。 让我们简要介绍实现这种分离的步骤。

第一步。将应用的业务逻辑与用户界面分离
MVC的主要思想是,任何具有用户界面的应用都可以分为两个模块:一个负责实现业务逻辑的模块,另一个是用户界面。 第一个模块将实现应用的主要功能。该模块是系统的核心,应用的领域模型在此实现。在MVC范式中,该模块为字母M,即模型。 第二个模块实现了整个用户界面,包括向用户显示数据和处理用户与应用交互的逻辑。 这种分离的主要目标是确保系统的核心(在MVC术语中称为"模型")能够独立开发和测试。 完成这种分离后,应用程序的架构如下:

步骤2:使用观察者模式使模型更加独立,并同步用户界面
这里有两个目标:
- 实现模型更大的独立性
- 同步用户界面
以下示例将帮助你理解用户界面同步的含义。 假设我们在网上购买电影票,查看影院的可用座位数。与此同时,可能还有别人在买电影票。如果这位观众比我们先买票,我们希望看到我们考虑的演出时间内座位数有所减少。 现在让我们来思考如何在程序中实现这一点。假设我们有系统的核心(模型)和界面(购票网页)。 两个用户同时在剧院里选择座位。 第一位用户购买了一张票。网页需要向第二位用户展示此事。 这怎么可能发生? 如果我们从核心更新接口,那么核心(我们的模型)将依赖于接口。在开发和测试模型时,我们必须考虑各种界面更新方式。 为此,我们需要实现观察者模式。这种模式允许模型向所有监听者发送变更通知。作为事件监听者(或观察者),用户界面接收通知并进行更新。 一方面,观察者模式让模型在不了解任何变化的情况下,告知界面(视图和控制器)发生了变化,从而保持独立性。另一方面,它使用户界面能够同步。
步骤3:将界面分为视图和控制器
我们继续将应用划分为模块,但现在在层级结构中更低层级。在这一步,用户界面(我们在第一步中将其拆分为独立模块)被拆分为视图和控制器。 在视角和手柄之间划清界限很难。如果我们说视图是用户所看到的,而控制器是允许用户与系统交互的机制,你可能会指出一个矛盾。 控制元件,比如网页上的按钮或手机屏幕上的虚拟键盘,基本上是手柄的一部分。但它们对用户来说和视图的任何部分一样清晰可见。 我们真正讨论的是功能分离。用户界面的主要任务是促进用户与系统的交互。这意味着该接口只有两个功能:
- 能够输出并方便地显示系统信息给用户
- 输入用户数据和命令(向系统传达)
这些功能决定了用户界面应如何划分为模块。 最终,系统架构如下:这就是我们如何得出由三个模块组成的应用,分别是模型、视图和控制器。 让我们总结一下:

- 根据MVC范式的原则,系统必须被划分为多个模块。
- 最重要且独立的模块应是模型。
- 模型是系统的核心。应该可以独立于用户界面开发和测试。
- 为此,在分割的第一步,我们需要将系统拆分为模型和用户界面。
- 然后,利用观察者模式,我们增强模型的独立性并同步用户界面。
- 第三步是将用户界面划分为控制器和视图。
- 接收用户数据到系统所需的一切都在控制器里。
- 向用户传递信息所需的一切都在视图中。

在你喝热巧克力之前,还有一件重要的事要讨论。
关于视图和控制器如何与模型交互
通过控制器输入信息,用户可以更改型号。 或者至少,用户会更改模型数据。当用户通过界面元素(通过视图)接收信息时,用户实际上是在接收关于模型的信息。 这是怎么发生的?视图和控制器通过什么方式与模型交互?毕竟,视图的类不能直接调用模型类的方法来读写数据。否则,我们就无法说模型是独立的。 模型是一组密切相关的类,视图和控制器都不应访问这些类。 为了将模型与视图和控制器连接,我们需要实现门面设计模式。模型的立面是模型与用户界面之间的一层,视图通过它接收方便格式化的数据,控制器通过调用立面上的必要方法来更改数据。 最终,一切看起来是这样的:

MVC:我们能获得什么?
MVC范式的主要目标是将业务逻辑(模型)的实现与其可视化(视图)分离。 这种分离增加了代码重复使用的可能性。 MVC的好处最明显的是我们需要以不同格式呈现相同数据。例如,以表格、图表或图表的形式(使用不同视图)。同时,在不影响视图实现方式的前提下,我们可以改变对用户操作(点击按钮、数据录入)的响应方式。 如果你遵循MVC的原则,可以简化软件开发,提高代码可读性,并提升可扩展性和可维护性。 在"企业开发导论"系列的最后一篇文章中,我们将探讨使用Spring MVC构建的MVC实现。第八部分。让我们用Spring Boot编写一个小型应用程序