接下來我們繼續(xù)來討論 JSF 體系結(jié)構(gòu)中的各種設(shè)計模式。本文將詳細討論Composite、Template Method 和 Observer 設(shè)計模式。我將分析每種模式的用途及其在 JSF 框架中的作用。
Composite 模式
Composite 模式讓客戶代碼能夠統(tǒng)一處理復(fù)合對象和基本對象。復(fù)合對象是基本對象的容器。在階段(Restore View 階段)和后一個階段(Render Response 階段),使用 JSF UI 組件構(gòu)造 UI View。UIComponentBase 就是 Composite 模式中 Component 抽象類的一個例子。UIViewRoot 是 Composite 類,而 UIOutput(比方說)就是葉子(或者基本類)。UIComponentBase 類定義了葉子和復(fù)合對象的公共方法,如編碼/解碼值和子節(jié)點管理函數(shù)。子節(jié)點管理函數(shù),如 getChildren,對于葉子節(jié)點返回空列表,對于復(fù)合節(jié)點則返回其子節(jié)點。
Template Method 模式
Template Method 模式的目的是將變化的步驟推遲到子類中,而在父類中定義那些固定的算法步驟。JSF 框架通過 PhraseListeners 展現(xiàn)了 Template Method 模式提供的功能。采用 Template Method(或者 “hook”)使得 Web 作者可以為不同階段之間的可選步驟提供實現(xiàn),而主要階段仍然和 JSF 框架的定義一致。JSF 框架提供了 PhaseListeners,概念上類似于 Template Method 模式中的可變步驟。JSF 框架有六個預(yù)定義的階段,在每個階段之間,Web 作者可以實現(xiàn) PhaseListeners 來提供類似于 Template Method hook 的 hook。事實上,這種結(jié)構(gòu)比 Template Method 模式更具有擴展性。可以通過注冊 PhraseId 為 ANY_PHRASE 的 PhaseListener 在每個階段后提供 hook。如果 PhaseId 是 ANY_PHASE,JSF 實現(xiàn)就會在每個階段之前和之后調(diào)用該 PhaseListener。JSF 框架中的實現(xiàn)略有不同,因為可以根本沒有 PhaseListener,但是在 Template Method 模式中,子類通常重新定義父類中抽象的可變步驟。
Observer 模式
Observer 模式的目的是當(dāng)目標對象的狀態(tài)改變時自動通知所有依賴的對象(即觀察器)。JSF 在 UI 組件中實現(xiàn)了 Observer 模式。JSF 有兩類內(nèi)建事件:ActionEvent 和 ValueChangedEvent。ActionEvent 用于確定用戶界面組件(如按鈕)的。當(dāng)用戶單擊按鈕時,JSF 實現(xiàn)通知添加到該按鈕上的一個或多個動作程序。于是該按鈕被,或者說按鈕(主體)的狀態(tài)改變了。添加到按鈕上的所有程序(即觀察器)都收到通知該主體狀態(tài)已經(jīng)改變。類似的,當(dāng)輸入 UI 組件中的值改變時,JSF 實現(xiàn)通知 ValueChangeListener。