一.什么是復合模式?
在形式上,復合模式確實是多個模式的組合,但滿足了這一條並不一定是復合模式,注意它的定義:
將多個模式結合起來形成一個“框架”,以解決一般性問題
一提到“框架”,可能最容易聯想到的就是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一個,只是其余的框架目前尚未接觸到,不好妄加評論
面對一個不熟悉的框架,不妨先從設計的角度簡單分析下它的內部實現,比如應用了哪些設計模式,各個層的功能及層間的交互等等
了解一些基礎的設計模式有助於我們快速接受一個框架,只有清楚了框架的內部實現,才能更好的駕馭它。。