本資料是“企業發展概論”系列的一部分。往期文章:
在本文中,我們將了解一種叫做 MVC 的東西。我們將討論什麼是 MVC,觸及它的歷史,探索 MVC 中體現的基本思想和概念,逐步了解如何將應用程序分解為模型、視圖和控制器模塊,編寫一個使用 Spring Boot 的小型 Web 應用程序,並以 Spring MVC 為例,了解如何將數據從 Java 代碼發送到 HTML 頁面。要理解這些材料,您需要熟悉設計模式,尤其是觀察者和外觀。並且熟悉 HTTP 請求和響應,理解 HTML 的基礎知識,知道什麼是 Java 註解。喝杯咖啡吃點心,放鬆一下。讓我們開始。
從這一切,我們可以得出一個合乎邏輯的結論。一個複雜的系統需要進行模塊劃分。讓我們簡要描述一下實現這種分離的步驟。
這就是我們如何得到一個由三個模塊組成的應用程序,稱為模型、視圖和控制器。讓我們總結一下:

MVC 的歷史
MVC 背後的想法是由 Trygve Reenskaug 在 1970 年代後期在 Xerox PARC 工作時制定的。在那些日子裡,使用計算機工作需要學位並不斷研究大量文檔。Reenskaug 與一群非常強大的開發人員一起解決的任務是簡化普通用戶與計算機的交互。有必要創造一種工具,一方面要極其簡單易懂,另一方面要能夠控制計算機和復雜的應用程序。Reenskaug 所在的團隊開發了“適合所有年齡段的兒童”的筆記本電腦——Dynabook,以及在 Alan Kay 的領導下開發的 SmallTalk 語言。就在那時,友好界面的概念被確立了。在許多方面,Reenskaug 和他的團隊所做的工作影響了 IT 領域的發展。這是一個有趣的事實,它並不直接適用於 MVC,但說明了這些發展的重要性。艾倫·凱說, “當我第一次接觸 Apple 時,那是在 84 年,當時 Mac 已經問世,《新聞周刊》聯繫了我,問我對 Mac 的看法。我說,‘好吧,Mac 是第一台足夠優秀的個人電腦受到批評。所以,在 2007 年發布 iPhone 之後,他把它拿到我面前,遞給了我。他說,'艾倫,這好到要被批評嗎?我說,‘史蒂夫,把它做得和平板電腦一樣大,你就會統治世界。’”3 年後,2010 年 1 月 27 日,Apple 推出了對角線為 9.7 英寸的 iPad。換句話說,史蒂夫·喬布斯幾乎完全遵循了艾倫·凱的建議。Reenskaug 的項目持續了 10 年。但是又過了 10 年,第一個關於 MVC 的出版物才曝光。Martin Fowler,多本關於軟件架構的書籍和文章的作者,提到他使用 Smalltalk 的工作版本研究了 MVC。由於很長一段時間沒有從原始來源獲得有關 MVC 的信息,並且由於其他幾個原因,出現了大量對這個概念的不同解釋。因此,許多人將 MVC 視為一種設計模式。不太常見的是,MVC 被稱為複合模式或多個模式的組合,它們一起工作以創建複雜的應用程序。但是,如前所述,MVC 實際上主要是一組架構思想/原則/方法,可以使用不同的模式以各種方式實現……接下來,我們將考慮嵌入在 MVC 概念中的主要思想。由於其他幾個原因,出現了大量對這個概念的不同解釋。因此,許多人將 MVC 視為一種設計模式。不太常見的是,MVC 被稱為複合模式或多個模式的組合,它們一起工作以創建複雜的應用程序。但是,如前所述,MVC 實際上主要是一組架構思想/原則/方法,可以使用不同的模式以各種方式實現……接下來,我們將考慮嵌入在 MVC 概念中的主要思想。由於其他幾個原因,出現了大量對這個概念的不同解釋。因此,許多人將 MVC 視為一種設計模式。不太常見的是,MVC 被稱為複合模式或多個模式的組合,它們一起工作以創建複雜的應用程序。但是,如前所述,MVC 實際上主要是一組架構思想/原則/方法,可以使用不同的模式以各種方式實現……接下來,我們將考慮嵌入在 MVC 概念中的主要思想。MVC:基本思想和原則
- VC 是一套架構思想和原則,用於構建具有用戶界面的複雜信息系統
- MVC是縮寫,代表:模型-視圖-控制器

步驟 1. 將應用程序的業務邏輯與用戶界面分離
MVC 的主要思想是任何具有用戶界面的應用程序都可以分為 2 個模塊:負責實現業務邏輯的模塊和用戶界面。第一個模塊將實現應用程序的主要功能。該模塊是系統的核心,應用程序的領域模型在這裡實現。在MVC範式中,這個模塊就是字母M,即模型。第二個模塊實現了整個用戶界面,包括向用戶顯示數據和處理用戶與應用程序交互的邏輯。這種分離的主要目標是確保系統的核心(MVC 術語中的“模型”)可以獨立開發和測試。進行此分離後,應用程序的架構如下所示:
第 2 步 使用觀察者模式使模型更加獨立並同步用戶界面
這裡我們有兩個目標:- 為模型實現更大的獨立性
- 同步用戶界面
Step 3 將界面分離為視圖和控制器
我們繼續將應用程序劃分為模塊,但現在處於層次結構的較低級別。在此步驟中,用戶界面(我們在步驟 1 中將其分離為一個不同的模塊)被拆分為一個視圖和一個控制器。在視圖和控制器之間劃清界限是很困難的。如果我們說視圖是用戶看到的,而控制器是允許用戶與系統交互的機制,你可能會指出矛盾。網頁上的按鈕或手機屏幕上的虛擬鍵盤等控制元素基本上是控制器的一部分。但它們與視圖的任何部分一樣對用戶可見。我們在這裡真正談論的是功能分離。用戶界面的主要任務是促進用戶與系統的交互。- 輸出並方便地向用戶顯示系統信息
- 輸入用戶數據和命令(將它們傳達給系統)

- 根據MVC範式的原則,一個系統必須被分成模塊。
- 最重要和獨立的模塊應該是模型。
- 模型是系統的核心。應該可以獨立於用戶界面開發和測試它。
- 要實現這一點,在劃分的第一步,我們需要將系統劃分為模型和用戶界面。
- 然後,使用觀察者模式,我們增強了模型的獨立性並同步了用戶界面。
- 第三步是將用戶界面劃分為控制器和視圖。
- 將用戶數據接收到系統中所需的一切都在控制器中。
- 將信息傳遞給用戶所需的一切都在視圖中。
關於視圖和控制器如何與模型交互的一些信息
通過控制器輸入信息,用戶可以更改模型。或者至少,用戶更改了模型數據。當用戶通過界面元素(通過視圖)接收信息時,用戶正在接收有關模型的信息。這是怎麼發生的?視圖和控制器通過什麼方式與模型交互?畢竟,視圖類不能直接調用模型類的方法來讀取/寫入數據。否則,我們就不能說模型是獨立的。模型是一組密切相關的類,視圖和控制器都不應該訪問這些類。要將模型連接到視圖和控制器,我們需要實現外觀設計模式。模型的外觀是模型和用戶界面之間的層,視圖通過它接收方便格式化的數據,控制器通過調用外觀上的必要方法來更改數據。最後,一切看起來像這樣:
GO TO FULL VERSION