自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

介紹JSF框架中使用的設(shè)計(jì)模式

開發(fā) 后端
本文探討了JSF框架中使用的設(shè)計(jì)模式。詳細(xì)討論的設(shè)計(jì)模式包括 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 模式。

設(shè)計(jì)模式可以幫助用戶在更高層次上抽象細(xì)節(jié),更好地理解體系結(jié)構(gòu)。如果比較熟悉 GoF 設(shè)計(jì)模式和 JavaServer Faces (JSF) 框架,本文可以幫助您洞察JSF框架中使用的設(shè)計(jì)模式,深入理解其工作原理。設(shè)計(jì)模式和 JavaServer Faces (JSF) 技術(shù),首先簡要地介紹一下模式和 JSF 框架。

模式

設(shè)計(jì)模式是對問題和解決方案進(jìn)行抽象的普遍適用的方法。因?yàn)槟J绞撬虚_發(fā)人員和架構(gòu)師公認(rèn)的,所以模式可以節(jié)約時(shí)間和資源。用外行話來說,模式就是關(guān)于某個(gè)人所共知的問題的經(jīng)過驗(yàn)證的解決方案。模式可以重用,重用使得解決方案更健壯。

Java Server Faces。 JSF 體系結(jié)構(gòu)是一種 Web 應(yīng)用程序框架。它是 Java Community Process (JCP) 推動(dòng)的,有望成為 Web 應(yīng)用程序開發(fā)的標(biāo)準(zhǔn)框架。目前用于開發(fā) Web 應(yīng)用程序的框架有 50 多個(gè),這說明迫切需要實(shí)現(xiàn)框架的標(biāo)準(zhǔn)化,這正是 JSF 框架的目標(biāo)!
深入剖析 JSF 模式

現(xiàn)在我們來討論各種JSF體系結(jié)構(gòu)中的設(shè)計(jì)模式。本文將詳細(xì)討論 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 設(shè)計(jì)模式。我將分析每種模式的用途及其在 JSF 框架中的作用。

Singleton 模式

Singleton 模式的目的是保證類只有一個(gè)實(shí)例被加載,該實(shí)例提供一個(gè)全局訪問點(diǎn)。當(dāng)啟動(dòng)具有 JSF 支持的 Web 應(yīng)用程序時(shí),Web 容器初始化一個(gè) FacesServlet 實(shí)例。在這個(gè)階段,F(xiàn)acesServlet 對每個(gè) Web 應(yīng)用程序?qū)嵗?Application 和 LifeCycle 實(shí)例一次。這些實(shí)例就采用眾所周知的 Singleton 模式,通常只需要該類型的一個(gè)實(shí)例。

使用 JSF 的 Web 應(yīng)用程序只需要 Application 和 LifeCycle 類的一個(gè)實(shí)例。LifeCycle 管理多個(gè) JSF 請求的整個(gè)生命期。因?yàn)槠錉顟B(tài)和行為在所有請求之間共享,這些對象采用 Singleton 模式合情合理。LifeCycle 維護(hù)的 PhaseListeners 也是 Singleton 模式的。PhaseListeners 由所有 JSF 請求共享。在 JSF 框架中可以廣泛使用 Singleton 模式,以減少內(nèi)存占用和提供對象的全局訪問。NavigationHandler(用于確定請求的邏輯結(jié)果)和 ViewHandler(用于創(chuàng)建視圖)也是使用 Singleton 模式的例子。

Model-View-Controller (MVC)

MVC 模式的目的是從數(shù)據(jù)表示(View)中將數(shù)據(jù)(即 Model)分離出來。如果應(yīng)用程序有多種表示,可以僅替換視圖層而重用控制器和模型代碼。類似的,如果需要改變模型,可以在很大程度上不改變視圖層??刂破魈幚碛脩魟?dòng)作,用戶動(dòng)作可能造成模型改變和視圖更新。當(dāng)用戶請求一個(gè) JSF 頁面時(shí),請求發(fā)送到 FacesServlet。FacesServlet 是 JSF 使用的前端控制器 servlet。和其他很多 Web 應(yīng)用程序框架一樣,JSF 使用 MVS 模式消除視圖和模型之間的耦合。為了集中處理用戶請求,控制器 servlet 改變模型并將用戶導(dǎo)航到視圖。

FacesServlet 是 JSF 框架中所有用戶請求都要經(jīng)過的控制器元素。FacesServlet 分析用戶請求,使用托管 bean 對模型調(diào)用各種動(dòng)作。后臺(tái)(backing)或托管(managed)bean 就是該模型的例子。JSF 用戶界面(UI)組件是視圖層的例子。MVC 模式把任務(wù)分解給具有不同技能的開發(fā)人員,使這些任務(wù)能夠同時(shí)進(jìn)行,這樣 GUI 設(shè)計(jì)人員就可以使用豐富的 UI 組件創(chuàng)建 JSF 頁面,同時(shí)后端開發(fā)人員可以創(chuàng)建托管 bean 來編寫專門的業(yè)務(wù)邏輯代碼。

Factory Method 模式

Factory Method 模式的目的是定義一個(gè)用于創(chuàng)建對象的接口,但是把對象實(shí)例化推遲到子類中。在 JSF 體系結(jié)構(gòu)中,F(xiàn)actory Method 模式被用于創(chuàng)建對象。LifeCycleFactory 是一個(gè)創(chuàng)建和返回 LifeCycle 實(shí)例的工廠對象。LifeCycleFactory 的 getLifeCycle (String LifeCycleId) 方法采用 Factory Method 模式,根據(jù) LifeCycleId 創(chuàng)建(如果需要)并返回 LifeCycle 實(shí)例。自定義的 JSF 實(shí)現(xiàn)可以重新定義 getLifeCycle 抽象方法來創(chuàng)建自定義的 LifeCycle 實(shí)例。默認(rèn)的 JSF 實(shí)現(xiàn)提供默認(rèn)的 LifeCycle 實(shí)例。此外,對于每個(gè) JSF 請求,F(xiàn)acesServlet 都從 FacesContextFactory 得到 FacesContext。FacesContextFactory 是一個(gè)抽象類,公開了 getFacesContext API,JSF 實(shí)現(xiàn)提供了 FacesContextFactory 和 getFacesContext API 的具體實(shí)現(xiàn)。這是另外一個(gè)使用 Factory Method 模式的例子,具體的 FacesContextFactory 實(shí)現(xiàn)創(chuàng)建 FacesContext 對象。

State 模式

State 模式的目的是在表示狀態(tài)的不同類之間分配與狀態(tài)有關(guān)的邏輯。FacesServlet 對 LifCycle 實(shí)例調(diào)用 execute 和 render 方法。LifeCycle 協(xié)調(diào)不同的 Phrase 以便執(zhí)行 JSF 請求。在這里 JSF 實(shí)現(xiàn)就遵循了 State 模式。如果沒有使用這種模式,LifeCycle 實(shí)現(xiàn)就會(huì)被大量的條件(即 “if” 語句)攪得一塌糊涂。JSF 實(shí)現(xiàn)為每個(gè)狀態(tài)(或階段)創(chuàng)建單獨(dú)的類并調(diào)用 step。phase 是一個(gè)抽象類,定了每個(gè) step 的公共接口。在 JSF 框架中定義了六個(gè) phrase(即 step):RestoreViewPhase、ApplyRequestValues、ProcessValidationsPhase、 UpdateModelValuesPhase、InvokeApplicationPhase 和 RenderResponsePhase。

在 State 模式中,LifeCycle 把 FacesContext 對象傳遞給 phase。每個(gè)階段或狀態(tài)改變傳遞給它的上下文信息,然后設(shè)置 FacesContext 本身中的標(biāo)志表明下一個(gè)可能的步驟。JSF 實(shí)現(xiàn)在每個(gè)步驟中改變其行為。每個(gè)階段都可以作為下一個(gè)階段的起因。FacesContext 有兩種標(biāo)志 renderResponse 和 responseComplete 可以改變執(zhí)行的順序。每個(gè)步驟執(zhí)行完成后,LifeCycle 檢查上一階段是否設(shè)置了這些標(biāo)志。如果設(shè)置了 responseComplete,LifeCycle 則完全放棄請求的執(zhí)行。如果經(jīng)過某個(gè)階段后設(shè)置了 renderResponse 標(biāo)志,JSF 就會(huì)跳過剩下的階段而直接進(jìn)入 Render Response 階段。如果這兩個(gè)標(biāo)志都沒有設(shè)置,LifeCycle 就會(huì)按順序繼續(xù)執(zhí)行下一步。

Composite 模式

Composite 模式讓客戶代碼能夠統(tǒng)一處理復(fù)合對象和基本對象。復(fù)合對象是基本對象的容器。在第一階段(Restore View 階段)和最后一個(gè)階段(Render Response 階段),使用 JSF UI 組件構(gòu)造 UI View。UIComponentBase 就是 Composite 模式中 Component 抽象類的一個(gè)例子。UIViewRoot 是 Composite 類,而 UIOutput(比方說)就是葉子(或者基本類)。UIComponentBase 類定義了葉子和復(fù)合對象的公共方法,如編碼/解碼值和子節(jié)點(diǎn)管理函數(shù)。子節(jié)點(diǎn)管理函數(shù),如 getChildren,對于葉子節(jié)點(diǎn)返回空列表,對于復(fù)合節(jié)點(diǎn)則返回其子節(jié)點(diǎn)。

Decorator 模式

Decorator 模式的目的是不通過子類化動(dòng)態(tài)擴(kuò)展對象的行為。JSF 框架有很多擴(kuò)展點(diǎn)(即可插入機(jī)制)。JSF 實(shí)現(xiàn)可使用 Decorator 模式替換默認(rèn)的 PropertyResolver、VariableResolver、ActionListener、NavigationHandler、 ViewHandler 或 StateManager。通常自定義實(shí)現(xiàn)接受通過構(gòu)造函數(shù)傳遞給它的默認(rèn)實(shí)現(xiàn)的引用。自定義實(shí)現(xiàn)僅僅改寫功能的一個(gè)子集,而將其他功能委托給默認(rèn)實(shí)現(xiàn)。如果希望實(shí)現(xiàn)自定義的 ViewHandler,改寫默認(rèn) ViewHandler 實(shí)現(xiàn)的 calculateLocale 方法,可以像 清單 1 那樣編寫 CustomViewHandler 類:


Strategy 模式

Strategy 模式的目的是封裝不同的概念。JSF 框架采用 Strategy 模式使用委托實(shí)現(xiàn)模型呈現(xiàn) UI 組件。JSF 技術(shù)支持兩種呈現(xiàn)模型。在直接實(shí)現(xiàn)模型中,UI 組件對收到的請求中的數(shù)據(jù)進(jìn)行解碼,然后編碼這些數(shù)據(jù)進(jìn)行顯示。在委托實(shí)現(xiàn)模型中,解碼和編碼操作委托給和組建關(guān)聯(lián)的專門呈現(xiàn)器。后一種模型利用了 Strategy 設(shè)計(jì)模式,比直接實(shí)現(xiàn)更靈活。在 Strategy 模式中,將不同的算法封裝在單獨(dú)的對象中,從而可以動(dòng)態(tài)地改變算法。JSF 實(shí)現(xiàn)可以用已有的 renderkit 實(shí)例注冊另外的呈現(xiàn)器,當(dāng)應(yīng)用程序啟動(dòng)的時(shí)候,JSF 實(shí)現(xiàn)讀取配置文件將這些呈現(xiàn)器和 UI 組件聯(lián)系在一起。

Template Method 模式

Template Method 模式的目的是將變化的步驟推遲到子類中,而在父類中定義那些固定的算法步驟。JSF 框架通過 PhraseListeners 展現(xiàn)了 Template Method 模式提供的功能。采用 Template Method(或者 “hook”)使得 Web 作者可以為不同階段之間的可選步驟提供實(shí)現(xiàn),而主要階段仍然和 JSF 框架的定義一致。JSF 框架提供了 PhaseListeners,概念上類似于 Template Method 模式中的可變步驟。JSF 框架有六個(gè)預(yù)定義的階段,在每個(gè)階段之間,Web 作者可以實(shí)現(xiàn) PhaseListeners 來提供類似于 Template Method hook 的 hook。事實(shí)上,這種結(jié)構(gòu)比 Template Method 模式更具有擴(kuò)展性??梢酝ㄟ^注冊 PhraseId 為 ANY_PHRASE 的 PhaseListener 在每個(gè)階段后提供 hook。如果 PhaseId 是 ANY_PHASE,JSF 實(shí)現(xiàn)就會(huì)在每個(gè)階段之前和之后調(diào)用該 PhaseListener。JSF 框架中的實(shí)現(xiàn)略有不同,因?yàn)榭梢愿緵]有 PhaseListener,但是在 Template Method 模式中,子類通常重新定義父類中抽象的可變步驟。

Observer 模式

Observer 模式的目的是當(dāng)目標(biāo)對象的狀態(tài)改變時(shí)自動(dòng)通知所有依賴的對象(即觀察器)。JSF 在 UI 組件中實(shí)現(xiàn)了 Observer 模式。JSF 有兩類內(nèi)建事件:ActionEvent 和 ValueChangedEvent。ActionEvent 用于確定用戶界面組件(如按鈕)的激活。當(dāng)用戶單擊按鈕時(shí),JSF 實(shí)現(xiàn)通知添加到該按鈕上的一個(gè)或多個(gè)動(dòng)作監(jiān)聽程序。于是該按鈕被激活,或者說按鈕(主體)的狀態(tài)改變了。添加到按鈕上的所有監(jiān)聽程序(即觀察器)都收到通知該主體狀態(tài)已經(jīng)改變。類似的,當(dāng)輸入 UI 組件中的值改變時(shí),JSF 實(shí)現(xiàn)通知 ValueChangeListener。

結(jié)束語

JSF 框架利用了 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 設(shè)計(jì)模式。因?yàn)樗捏w系結(jié)構(gòu)建立在已經(jīng)驗(yàn)證的設(shè)計(jì)模式的基礎(chǔ)上,這是一個(gè)健壯的框架,JSF框架中使用的設(shè)計(jì)模式得到了很好的利用。

【編輯推薦】

  1. 簡述JSF入門介紹
  2. JSF和Struts的區(qū)別概述
  3. 編寫JSF自定義復(fù)合組件的原則和技巧
  4. 選擇JSF不選Struts的十大理由
  5. Tapestry和JSF對比
責(zé)任編輯:佚名 來源: 中國IT實(shí)驗(yàn)室
相關(guān)推薦

2009-06-24 17:21:23

JSF框架設(shè)計(jì)模式

2009-06-24 17:34:58

使用JSF的經(jīng)驗(yàn)

2009-06-23 11:35:44

JSF的Naviati

2009-06-26 14:06:08

JSF基礎(chǔ)框架

2009-06-23 13:01:04

JSF應(yīng)用

2009-06-23 13:55:17

JSF標(biāo)簽

2009-06-29 14:30:27

JSF技術(shù)

2009-06-22 14:13:08

JSF入門

2011-07-21 17:11:09

AjaxJSF

2009-06-22 15:52:15

JSF測試框架

2009-06-23 15:51:00

JSF框架

2024-12-03 08:00:00

2009-06-24 13:50:29

JSF和MVC

2011-06-30 10:20:38

JSFMVC

2009-06-24 17:43:24

Struts和JSF

2011-07-08 17:26:38

JSFStruts

2009-06-24 10:47:55

JSF生命周期

2010-05-25 16:39:56

SVN中使用Git

2010-01-18 09:37:39

JSF 2.0Java EE 6

2023-07-03 07:39:43

Spring框架設(shè)計(jì)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)