一.什麼是複合模式?
在形式上,複合模式確實是多個模式的組合,但滿足了這一條並不一定是複合模式,注意它的定義:
將多個模式結合起來形成一個「框架」,以解決一般性問題。一提到「框架」,可能最容易聯想到的就是 MVC 吧,不過 MVC 確實是一個經典的複合模式
二.MVC 與複合模式
Model,View,Controller 各自的職責:

這裡不得不強調一下控制邏輯與應用邏輯(演算法邏輯)的區別:
- 所謂控制邏輯,就是判斷在當前情景下應該調用什麼物件的什麼方法
- 而應用邏輯指的是具體物件的具體方法的內部實現(某個複雜的演算法,或者一系列的具體處理)
(非要細說的話,View 裡面其實也包含了一點控制邏輯(根據使用者動作判斷應該調用哪一個 Controller),當然,一般情況我們都把這點邏輯忽略不計的)
MVC 的最大優點就是把表現層 View 與模型 Model 分離,實現了設計上的鬆耦合(應對變化)以及程式碼的複用(View 可以隨便換,只需要改改新 View 裡面那一丁點兒控制邏輯就好了)
前面說過了 MVC 是一種複合模式,那它到底複合了哪些模式,一起看看:
- 觀察者模式:V 和 C 都是 M 的觀察者(Model 的狀態更新要及時通知 V 更新視圖,或者通知 C 做相應邏輯處理)
- 策略模式:C 是 V 的「策略」,所以 V 包含的控制邏輯就是「選擇策略」,也就是選擇控制器 Controller
- 組合模式:V 的自身實現應用了組合模式(調用頂層容器的 repaint 方法,容器內的所有元件都會重繪)
MVC 應用了多個模式,並能夠較好的解決設計上的一般性問題,所以被稱為複合模式
三.傳統 MVC 與 Java 本地程式的 MVC
從上面可以看到傳統 MVC 中具體的應用邏輯都被包含在 M 裡面,也就是說,我們的模型物件不僅具有一系列屬性(和 getter, setter)還要有相關的資料處理方法
這與 Java 本地程式中的 MVC 不同,在 Java 程式中我們通過建包 package 來對程式碼結構進行分層,一般是這樣做的:

需要說明的是:
- vo 包裡面一般都是各個實體抽象出來的類(也有把包名定為 bean 的,不過意義都一樣,只包含各個實體的屬性及其對應的 getter 和 setter,不含應用邏輯)
- dao 和 core 都是 service 的輔助層,三層共同映射為 Controller
Java 本地程式的 MVC 與傳統 MVC 的最大區別就是 Java 中的 M 更純粹(乾淨),只包含單純的值物件,不含任何應用邏輯,幾乎所有的邏輯都被裝到了 Controller 裡面(各種 Concrete Service 類)
寫在後面:
應用了複合模式的成熟框架遠不止 MVC 一個,只是其餘的框架目前尚未接觸到,不好妄加評論
面對一個不熟悉的框架,不妨先從設計的角度簡單分析下它的內部實現,比如應用了哪些設計模式,各個層的功能及層間的交互等等
瞭解一些基礎的設計模式有助於我們快速接受一個框架,只有清楚了框架的內部實現,才能更好的駕馭它。。
暫無評論,快來發表你的看法吧