前言
MVC(Model-View-Controller)雖不屬於 GoF 23 種設計模式,但被 GoF 書作為重要範例推崇,屬於**高層架構模式**,由多個基礎模式組合而成。本文分析 MVC 在 Java Swing(元件層級)與 J2EE(企業應用架構層級)的兩種實踐形態。
MVC 核心角色
- Model:封裝資料源與業務操作,代表元件狀態。
- View:封裝資料呈現,一個 Model 可對應多個 View。
- Controller:封裝外部操作,轉發至 Model,解耦 View 與 Model。
模式組合視角
- Model-View:Observer 模式**——模型狀態變更通知視圖更新。
- View-Controller:Strategy 模式**——視圖透過具體 Controller 實例實現特定回應策略。
- 其他組合:Composite(視圖嵌套)、Factory Method(指定 Controller)等。
Swing 中的 MVC 變體:Model-ViewController (M-VC)
設計演進
Swing 初期採用標準 MVC,但發現 View 與 Controller 緊密耦合,難以通用化,故演變為 **M-VC**:Model 獨立介面,View 與 Controller 融合於 UI Delegate** 中。
關鍵實作
- Model 介面:如
BoundedRangeModel 同時服務 JProgressBar、JScrollBar、JSlider,體現模型共用。
- UI Delegate:每個元件持有
UI 介面實例,負責繪製與事件處理(Look & Feel 切換關鍵)。
- 事件通知機制:採用 JavaBeans 事件模型,Model 維護 Observer 列表,狀態變更時通知 UI。
- 輕量通知:僅告知狀態改變,由 Listener 向 Model 取值(適合高頻事件如
JScrollBar)。
- 狀態攜帶通知:事件物件包含變更值(適合
JTable 等複雜元件)。
J2EE 中的 MVC:架構層級的模式應用
藍圖定位
| 層級 | 技術 | 角色 |
| View | JSP(產生 HTML/WML/XML) | 多種用戶介面渲染 |
| Controller | Servlet / JavaBean | 接收請求、協調業務邏輯、選擇視圖 |
| Model | EJB (Entity Bean 封裝資料, Session Bean 封裝操作) | 核心業務邏輯與持久化 |
Controller 選擇策略
- Servlet:可獨立處理請求,適合複雜流程控制,但與 JSP 交互較繁瑣。
- JavaBean:與 JSP 搭配天然(
jsp:useBean、EL 表達式),專注視圖渲染,桌面應用亦可複用。
- 混合:Servlet 處理流程控制,委派 JavaBean 處理業務邏輯與資料封裝。
核心優勢
- **多介面支援**:同一 Model 服務 Web、無線、Web Service、Swing 等多種 View。
- **關注點分離**:業務邏輯不混雜於視圖,提升可測試性、可維護性、可擴展性。
- **動態切換**:運行時根據用戶裝置、角色、工作流選擇不同 View/Controller。
總結
MVC 從 Swing 的元件級 M-VC 變體,到 J2EE 的企業級架構模式,展現了設計模式在不同抽象層級的靈活應用。理解其內在模式組合(Observer、Strategy、Composite 等),能幫助開發者在具體專案中做出更合適的架構決策。