模式是藍圖,框架是半成品:釐清 MVC 設計模式與 MVC 框架的概念邊界
許多開發者混淆「MVC 模式」與「MVC 框架」。本文從軟件工程三大核心概念——架構、框架、設計模式出發,層層遞進剖析二者本質區別,並結合 Java Web 經典實踐(JSP/Servlet/JavaBean、Struts、Spring MVC)建立正確認知模型。
一、 三大核心概念定義
| 概念 | 定義 | 關鍵特征 |
| 架構 | 系統藍圖,抽象組件及其通信關係 | 高層決策、非功能性需求、技術選型邊界 |
| 框架 | 特定領域的半成品,提供基礎設施與擴展點 | 控制反轉 (IoC)、規約優於配置、熱點/凍結點、代碼重用 |
| 設計模式 | 反復出現問題的通用解決方案描述 | 設計重用、抽象級、語言無關、構建框架的基石 |
核心結論:框架是代碼重用(軟件),設計模式是設計重用(知識)。框架包含/實現了設計模式,模式是框架的理論基礎。
二、 MVC 設計模式:概念層面的「三層分工」
- Model (模型):數據邏輯、業務規則、持久化封裝(如 JavaBean、Service、DAO、Entity)。
- View (視圖):數據展示、用戶交互(HTML、JSP、Velocity、Thymeleaf、JSON 序列化)。
- Controller (控制器):請求接收、協調 Model/View、流程控制(Servlet、Struts Action、Spring MVC @Controller)。
本質:一種架構模式,規定「誰幹什麼」,不規定「怎麼幹」,不綁定具體技術棧。
三、 MVC 框架:工程層面的「規約與骨架」
- 強制分離:通過目錄結構、配置規約、基類/接口強制 M/V/C 物理隔離。
- 提供基礎設施:URL 路由分發、參數綁定/校驗、視圖解析、異常處理、國際化、主題、攔截器/AOP 集成。
- 經典實現:
- Model 1:JSP + JavaBean(無 Controller,邏輯在 JSP)。
- Model 2:JSP + Servlet + JavaBean(Servlet 做 Controller)。
- Struts 1/2:配置文件映射、ActionForm、攔截器鏈。
- Spring MVC:註解驅動、DispatcherServlet、HandlerMapping/Adapter、REST 支持。
四、 區別對比總結表
| 維度 | MVC 設計模式 | MVC 框架 |
| 抽象層級 | 概念/設計層 | 代碼/工程層 |
| 交付物 | 思想、圖紙、原則 | JAR 包、配置規約、基類、工具類 |
| 強制性 | 建議性,靠自覺遵守 | 強制性,違反規約編譯/運行報錯 |
| 靈活性 | 極高,可任意技術實現 | 受限於框架規約與擴展點 |
| 學習成本 | 低(理解三角色職責) | 高(API、生命周期、配置、擴展機制) |
| 關係 | 框架的理論基礎 | 模式的工程化落地 |
五、 經典類比:蓋房子
- MVC 設計模式 = 建築設計圖紙:標明地基、承重牆、水電走向、功能分區(客廳/臥室/廚房)。
- MVC 框架 = 預製構件 + 施工規範:標準化鋼筋籠、模板、水電預埋管、驗收標準。工人(開發者)按規範組裝,效率高、質量穩,但不能隨意拆改承重牆(核心規約)。
六、 常見框架與其底層模式對照
| 語言/平台 | 框架 | 底層設計模式 |
| Java | SSH (Struts2/Spring/Hibernate)、Spring MVC、JSF | MVC、Front Controller、IoC、AOP、ORM |
| Python | Django、Flask、FastAPI | MTV (Model-Template-View)、MVC |
| PHP | Laravel、ThinkPHP、Yii | MVC、ActiveRecord |
| C++ | Qt、MFC、GTK | MVC、Document/View、Signal/Slot |
七、 總結:正確認知指導實踐
- 先學模式,後用框架:理解 MVC 職責邊界,再看框架如何落地,不再迷失於 API 堆砌。
- 框架是手段,非目的:選型基於「解決具體問題」(如 Spring MVC 解決參數綁定、REST、異常統一),而非「簡歷關鍵詞」。
- 保持架構整潔:即使框架變更(Struts → Spring MVC → Spring Boot → Spring Cloud),MVC 分層邊界不變,業務代碼遷移成本可控。