設(shè)計(jì)模式可以幫助用戶在更高層次上抽象細(xì)節(jié),更好地理解體系結(jié)構(gòu)。如果比較熟悉 GoF 設(shè)計(jì)模式和 JavaServer Faces (JSF) 框架,本文可以幫助您洞察 JSF 框架中使用的設(shè)計(jì)模式,深入理解其工作原理。
本文探討了 JSF 框架中使用的設(shè)計(jì)模式。詳細(xì)討論的設(shè)計(jì)模式包括 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 模式。
設(shè)計(jì)模式和 JavaServer Faces (JSF) 技術(shù)
首先簡(jiǎn)要地介紹一下模式和 JSF 框架。
模式。設(shè)計(jì)模式是對(duì)問(wèn)題和解決方案進(jìn)行抽象的普遍適用的方法。因?yàn)槟J绞撬虚_發(fā)人員和架構(gòu)師公認(rèn)的,所以模式可以節(jié)約時(shí)間和資源。用外行話來(lái)說(shuō),模式就是關(guān)于某個(gè)人所共知的問(wèn)題的經(jīng)過(guò)驗(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è),這說(shuō)明迫切需要實(shí)現(xiàn)框架的標(biāo)準(zhǔn)化,這正是 JSF 框架的目標(biāo)!
深入剖析 JSF 模式
現(xiàn)在我們來(lái)討論 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è)全局訪問(wèn)點(diǎn)。當(dāng)啟動(dòng)具有 JSF 支持的 Web 應(yīng)用程序時(shí),Web 容器初始化一個(gè) FacesServlet 實(shí)例。在這個(gè)階段,F(xiàn)acesServlet 對(duì)每個(gè) Web 應(yīng)用程序?qū)嵗?Application 和 LifeCycle 實(shí)例一次。這些實(shí)例就采用眾所周知的 Singleton 模式,通常只需要該類型的一個(gè)實(shí)例。
使用 JSF 的 Web 應(yīng)用程序只需要 Application 和 LifeCycle 類的一個(gè)實(shí)例。LifeCycle 管理多個(gè) JSF 請(qǐng)求的整個(gè)生命期。因?yàn)槠錉顟B(tài)和行為在所有請(qǐng)求之間共享,這些對(duì)象采用 Singleton 模式合情合理。LifeCycle 維護(hù)的 PhaseListeners 也是 Singleton 模式的。PhaseListeners 由所有 JSF 請(qǐng)求共享。在 JSF 框架中可以廣泛使用 Singleton 模式,以減少內(nèi)存占用和提供對(duì)象的全局訪問(wèn)。NavigationHandler(用于確定請(qǐng)求的邏輯結(jié)果)和 ViewHandler(用于創(chuàng)建視圖)也是使用 Singleton 模式的例子。
Model-View-Controller (MVC)
MVC 模式的目的是從數(shù)據(jù)表示(View)中將數(shù)據(jù)(即 Model)分離出來(lái)。如果應(yīng)用程序有多種表示,可以僅替換視圖層而重用控制器和模型代碼。類似的,如果需要改變模型,可以在很大程度上不改變視圖層??刂破魈幚碛脩魟?dòng)作,用戶動(dòng)作可能造成模型改變和視圖更新。當(dāng)用戶請(qǐng)求一個(gè) JSF 頁(yè)面時(shí),請(qǐng)求發(fā)送到 FacesServlet。FacesServlet 是 JSF 使用的前端控制器 servlet。和其他很多 Web 應(yīng)用程序框架一樣,JSF 使用 MVS 模式消除視圖和模型之間的耦合。為了集中處理用戶請(qǐng)求,控制器 servlet 改變模型并將用戶導(dǎo)航到視圖。
FacesServlet 是 JSF 框架中所有用戶請(qǐng)求都要經(jīng)過(guò)的控制器元素。FacesServlet 分析用戶請(qǐng)求,使用托管 bean 對(duì)模型調(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 頁(yè)面,同時(shí)后端開發(fā)人員可以創(chuàng)建托管 bean 來(lái)編寫專門的業(yè)務(wù)邏輯代碼。
Factory Method 模式
Factory Method 模式的目的是定義一個(gè)用于創(chuàng)建對(duì)象的接口,但是把對(duì)象實(shí)例化推遲到子類中。在 JSF 體系結(jié)構(gòu)中,F(xiàn)actory Method 模式被用于創(chuàng)建對(duì)象。LifeCycleFactory 是一個(gè)創(chuàng)建和返回 LifeCycle 實(shí)例的工廠對(duì)象?! ifeCycleFactory 的 getLifeCycle (String LifeCycleId) 方法采用 Factory Method 模式,根據(jù) LifeCycleId 創(chuàng)建(如果需要)并返回 LifeCycle 實(shí)例。自定義的 JSF 實(shí)現(xiàn)可以重新定義 getLifeCycle 抽象方法來(lái)創(chuàng)建自定義的 LifeCycle 實(shí)例。默認(rèn)的 JSF 實(shí)現(xiàn)提供默認(rèn)的 LifeCycle 實(shí)例。此外,對(duì)于每個(gè) JSF 請(qǐng)求,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 對(duì)象。
State 模式
State 模式的目的是在表示狀態(tài)的不同類之間分配與狀態(tài)有關(guān)的邏輯。FacesServlet 對(duì) LifCycle 實(shí)例調(diào)用 execute 和 render 方法。LifeCycle 協(xié)調(diào)不同的 Phrase 以便執(zhí)行 JSF 請(qǐng)求。在這里 JSF 實(shí)現(xiàn)就遵循了 State 模式。如果沒(méi)有使用這種模式,LifeCycle 實(shí)現(xiàn)就會(huì)被大量的條件(即 “if” 語(yǔ)句)攪得一塌糊涂。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。
本文探討了 JSF 框架中使用的設(shè)計(jì)模式。詳細(xì)討論的設(shè)計(jì)模式包括 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 模式。
設(shè)計(jì)模式和 JavaServer Faces (JSF) 技術(shù)
首先簡(jiǎn)要地介紹一下模式和 JSF 框架。
模式。設(shè)計(jì)模式是對(duì)問(wèn)題和解決方案進(jìn)行抽象的普遍適用的方法。因?yàn)槟J绞撬虚_發(fā)人員和架構(gòu)師公認(rèn)的,所以模式可以節(jié)約時(shí)間和資源。用外行話來(lái)說(shuō),模式就是關(guān)于某個(gè)人所共知的問(wèn)題的經(jīng)過(guò)驗(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è),這說(shuō)明迫切需要實(shí)現(xiàn)框架的標(biāo)準(zhǔn)化,這正是 JSF 框架的目標(biāo)!
深入剖析 JSF 模式
現(xiàn)在我們來(lái)討論 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è)全局訪問(wèn)點(diǎn)。當(dāng)啟動(dòng)具有 JSF 支持的 Web 應(yīng)用程序時(shí),Web 容器初始化一個(gè) FacesServlet 實(shí)例。在這個(gè)階段,F(xiàn)acesServlet 對(duì)每個(gè) Web 應(yīng)用程序?qū)嵗?Application 和 LifeCycle 實(shí)例一次。這些實(shí)例就采用眾所周知的 Singleton 模式,通常只需要該類型的一個(gè)實(shí)例。
使用 JSF 的 Web 應(yīng)用程序只需要 Application 和 LifeCycle 類的一個(gè)實(shí)例。LifeCycle 管理多個(gè) JSF 請(qǐng)求的整個(gè)生命期。因?yàn)槠錉顟B(tài)和行為在所有請(qǐng)求之間共享,這些對(duì)象采用 Singleton 模式合情合理。LifeCycle 維護(hù)的 PhaseListeners 也是 Singleton 模式的。PhaseListeners 由所有 JSF 請(qǐng)求共享。在 JSF 框架中可以廣泛使用 Singleton 模式,以減少內(nèi)存占用和提供對(duì)象的全局訪問(wèn)。NavigationHandler(用于確定請(qǐng)求的邏輯結(jié)果)和 ViewHandler(用于創(chuàng)建視圖)也是使用 Singleton 模式的例子。
Model-View-Controller (MVC)
MVC 模式的目的是從數(shù)據(jù)表示(View)中將數(shù)據(jù)(即 Model)分離出來(lái)。如果應(yīng)用程序有多種表示,可以僅替換視圖層而重用控制器和模型代碼。類似的,如果需要改變模型,可以在很大程度上不改變視圖層??刂破魈幚碛脩魟?dòng)作,用戶動(dòng)作可能造成模型改變和視圖更新。當(dāng)用戶請(qǐng)求一個(gè) JSF 頁(yè)面時(shí),請(qǐng)求發(fā)送到 FacesServlet。FacesServlet 是 JSF 使用的前端控制器 servlet。和其他很多 Web 應(yīng)用程序框架一樣,JSF 使用 MVS 模式消除視圖和模型之間的耦合。為了集中處理用戶請(qǐng)求,控制器 servlet 改變模型并將用戶導(dǎo)航到視圖。
FacesServlet 是 JSF 框架中所有用戶請(qǐng)求都要經(jīng)過(guò)的控制器元素。FacesServlet 分析用戶請(qǐng)求,使用托管 bean 對(duì)模型調(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 頁(yè)面,同時(shí)后端開發(fā)人員可以創(chuàng)建托管 bean 來(lái)編寫專門的業(yè)務(wù)邏輯代碼。
Factory Method 模式
Factory Method 模式的目的是定義一個(gè)用于創(chuàng)建對(duì)象的接口,但是把對(duì)象實(shí)例化推遲到子類中。在 JSF 體系結(jié)構(gòu)中,F(xiàn)actory Method 模式被用于創(chuàng)建對(duì)象。LifeCycleFactory 是一個(gè)創(chuàng)建和返回 LifeCycle 實(shí)例的工廠對(duì)象?! ifeCycleFactory 的 getLifeCycle (String LifeCycleId) 方法采用 Factory Method 模式,根據(jù) LifeCycleId 創(chuàng)建(如果需要)并返回 LifeCycle 實(shí)例。自定義的 JSF 實(shí)現(xiàn)可以重新定義 getLifeCycle 抽象方法來(lái)創(chuàng)建自定義的 LifeCycle 實(shí)例。默認(rèn)的 JSF 實(shí)現(xiàn)提供默認(rèn)的 LifeCycle 實(shí)例。此外,對(duì)于每個(gè) JSF 請(qǐng)求,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 對(duì)象。
State 模式
State 模式的目的是在表示狀態(tài)的不同類之間分配與狀態(tài)有關(guān)的邏輯。FacesServlet 對(duì) LifCycle 實(shí)例調(diào)用 execute 和 render 方法。LifeCycle 協(xié)調(diào)不同的 Phrase 以便執(zhí)行 JSF 請(qǐng)求。在這里 JSF 實(shí)現(xiàn)就遵循了 State 模式。如果沒(méi)有使用這種模式,LifeCycle 實(shí)現(xiàn)就會(huì)被大量的條件(即 “if” 語(yǔ)句)攪得一塌糊涂。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。