国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Session Facade 的規(guī)則和模式

2019-11-18 12:15:06
字體:
供稿:網(wǎng)友

  在過去幾年中,EnterPRise javaBeans™(EJB)確實(shí)已經(jīng)開始對 Java™ 對象設(shè)計(jì)產(chǎn)生影響。期間,我們看到的最常使用的 EJB 模式之一是session Facade 概念。這是一個讓很多開發(fā)者都受益匪淺的既強(qiáng)大又非常簡單的概念。然而,我也看到,對這一模式的確切含義及其在實(shí)踐中的應(yīng)用,人們?nèi)杂泻芏嗾`解。
  
  為了把這個問題講得更明白些,我會在本文中講述 Facade 的一些基本概念以及Session Facade 模式的工作機(jī)制,并探討該模式衍生出來的一些問題。希望能借此澄清一些誤解,并幫助開發(fā)者正確使用這種模式。
  
  什么是Session Facade?您又為什么需要它?
  很多地方都有對Session Facade 模式的清楚描述,也就是 [Sun 2001] 和 [Brown 2000]。我不想照抄那里的全部內(nèi)容,而打算把它的理論在此作個總結(jié):基本的問題是在 EJB 設(shè)計(jì)中,EJB 客戶機(jī)(例如,Servelet、Java 應(yīng)用程序,等等)不可直接訪問 Entity bean。
  
  之所以如此,有以下幾個原因:
  當(dāng)依靠 RMI-IIOP 進(jìn)行跨越網(wǎng)絡(luò)的調(diào)用時(shí)運(yùn)行態(tài)的性能會受到極大影響。假如客戶機(jī)請求一個Entity bean 去表示如包含兩項(xiàng)數(shù)據(jù)(比方說帳戶余額和帳戶所有者姓名)的銀行帳戶,則將需要兩個網(wǎng)絡(luò)調(diào)用。當(dāng)大量屬性使網(wǎng)絡(luò)調(diào)用成倍增加時(shí),很快這些開銷就會變得非常明顯。[Monson-Haefel] 中所說的批量訪問器(bulk accessors)或許是一種解決方案,所謂批量訪問器,就是Entity bean 上的一些方法,它們創(chuàng)建并返回值對象以表示Entity bean 中的數(shù)據(jù)。它事實(shí)上就是 Java VisualAge® 的 CopyHelper Access Beans 采用的解決方案。但是,它有一個令人遺憾的缺陷,就是它假設(shè)所有的請求都需要 EJB 中的“所有”數(shù)據(jù),結(jié)果為用戶返回了一些不必要的數(shù)據(jù),并導(dǎo)致對更大的值對象進(jìn)行組織和分解時(shí)產(chǎn)生額外開銷。
  
  更重要的是,假如您答應(yīng) EJB 客戶機(jī)直接訪問Entity bean,那么就要求客戶機(jī)了解Entity bean 的內(nèi)部方法,而這已經(jīng)超出了客戶機(jī)的應(yīng)知的范圍。例如,操作一個Entity bean 需要知道所涉及到的該實(shí)體的關(guān)系(關(guān)聯(lián),繼續(xù)),這樣就把業(yè)務(wù)模型的所有細(xì)節(jié)不適當(dāng)?shù)乇┞督o了客戶機(jī)。另外,操作多個Entity bean 會要求使用客戶端事務(wù) ? 這是另一個使事情復(fù)雜化的因素,這意味著 EJB 可能要被從客戶機(jī)設(shè)計(jì)中除去,而不是添加上去。
  大多數(shù)設(shè)計(jì)師已經(jīng)發(fā)現(xiàn)為了在 EJB 設(shè)計(jì)中避免直接訪問Entity bean 的解決方案都可以在 [Gamma] 中描述的 Facade 中找到。[Gamma] 這樣描述 Facade 模式:“為子系統(tǒng)中的一套接口提供了一個統(tǒng)一的接口。Facade 定義了一個更高層次的接口,使子系統(tǒng)更輕易使用。”1在 EJB 中應(yīng)用這種思想一般意味著您應(yīng)該創(chuàng)建一個擔(dān)當(dāng) Facade 的Session EJB,然后把構(gòu)成子系統(tǒng)的一套Entity bean “包裝”起來。這樣,客戶機(jī)就和Entity bean 實(shí)現(xiàn)的細(xì)節(jié)分離開來了,而且不必自己治理事務(wù)治理的細(xì)節(jié)。
  
  但問題是有很多人到此就打住了。然后他們輕松地往下做,開始把Entity bean 包裝到Session bean 中,而不考慮 Facade 模式所描述的其它內(nèi)容以及 EJB 設(shè)計(jì)中由 Facade 模式衍生出來的問題。這很可能是由于把得到的 Facade 的“二手”信息都當(dāng)真,而沒去研究原始模式的緣故。假如我們確實(shí)花了些時(shí)間去理解 Facade 衍生的問題,我們將可以看到很多該模式所固有的其它有益的設(shè)計(jì)可能性。
  
  Facade 模式的要點(diǎn)
  [Gamma] 中描述了很多我們應(yīng)該了解的 Facade 模式的要點(diǎn)。前面幾點(diǎn)可在 Facade 模式的“適用性”描述部分找到,它描述了在什么情況下您會需要應(yīng)用該模式。它們是:“當(dāng)您想為復(fù)雜的子系統(tǒng)提供一個簡單接口時(shí)……請使用 Facade 模式”和“當(dāng)您想把子系統(tǒng)分層時(shí)……請使用 Facade 模式。使用 Facade 為每一層子系統(tǒng)定義一個入口點(diǎn)。”2
  
  從對 Facade 模式的討論中,我們可以提煉出兩個觀點(diǎn)。第一點(diǎn)是 Facade 應(yīng)該提供子系統(tǒng)的一個抽象視圖,而不是簡單地把整個子系統(tǒng)本身的 API 直接包裝起來。不幸的是,我在實(shí)際中多次看到開發(fā)者創(chuàng)建的Session bean 把Entity bean home 和Entity bean 對象的全部方法直接包裝起來,而不提供任何額外的抽象,這是對該模式最可惡的濫用情況之一。請記住,這種思想是想降低整個系統(tǒng)的復(fù)雜性,而不是把復(fù)雜性轉(zhuǎn)移到另一個對象上。
  
  第二點(diǎn),也是更微妙的一點(diǎn),與分層有關(guān)。這個觀點(diǎn)認(rèn)為您可以用多重 Facade 來隱藏下層子系統(tǒng)的細(xì)節(jié)。因此,在這里您可以這樣設(shè)想,Session Facade 應(yīng)該在其它 Facade 之上,位于最上層,是對底層業(yè)務(wù)邏輯細(xì)節(jié)的進(jìn)一步抽象。這一點(diǎn)很要害。當(dāng)您看完下面兩條(分別出自 [Gamma] 中論述 Facade 模式的“協(xié)作”和“相關(guān)模式”部分)敘述后,就會更加清楚這一點(diǎn):
  
  “客戶機(jī)通過把請求發(fā)送給 Facade,再由 Facade 把請求轉(zhuǎn)發(fā)給適當(dāng)?shù)淖酉到y(tǒng)對象來與子系統(tǒng)通信。”3
  “facade 只是對通往子系統(tǒng)對象的接口進(jìn)行抽象以使它們更易于使用;它不定義新功能。”4
  我把這幾點(diǎn)總結(jié)如下:Facade 不做系統(tǒng)的實(shí)際工作;而是委托其他對象輪流做這個工作。由此推理出您必須正確地放置這些對象,以便使該模式能按照您所期望的運(yùn)行。
  
  這一點(diǎn)是本模式的兩種流行表達(dá) [Sun 2000] 和 [Sun 2001] 之間的主要不同之處。第一個版本,即 [Sun 2000],是 J2EE 規(guī)劃的一部分,它把這種模式稱為“Session Entity Facade”。它意在表明“為一堆企業(yè) beans 提供單一的接口”。它描述了這樣一種模式,即所有的數(shù)據(jù)存取都通過Entity bean 來完成,Session bean 則為這些Entity bean 提供接口。現(xiàn)在的問題是 [Sun 2000] 不一定非要以 EJB 為中心。它根本不涉及其它對象類型,并且假設(shè)系統(tǒng)中只有 EJB 一類對象。根據(jù)我的經(jīng)驗(yàn),我認(rèn)為這會導(dǎo)致根本不能在工程間重用的臃腫的Session對象,而且,在同一個工程內(nèi),當(dāng)需求有一點(diǎn)不同時(shí)就會出現(xiàn)問題。
  
  現(xiàn)在,[Sun 2001] 則更通用,也沒有上述問題的困擾。它簡單地把這種模式稱為“Session Facade”。它的解決方案規(guī)定您應(yīng)該“把Session bean 當(dāng)作 facade 來用,以封裝參與工作流的業(yè)務(wù)對象之間的交互操作的復(fù)雜性”。它根本不限制您的業(yè)務(wù)對象應(yīng)該為 EJB,因此是一個更加靈活的方法。
  
  Session Facade 的重要規(guī)則
  那么我們該如何應(yīng)用這些關(guān)于針對會話的 Facade 的規(guī)則呢?這對我們的 EJB 設(shè)計(jì)又意味著什么呢?我在設(shè)計(jì)Session Facade 時(shí)遵循三條基本原則:
  
  它們自己不做實(shí)際工作;它們委派其它對象做實(shí)際工作。這意味著Session facade 中的每個方法都應(yīng)該很小(異常處理邏輯不計(jì)算在內(nèi),代碼應(yīng)為五行或更少)。
  它們提供簡單的接口。這意味著 facade 方法的數(shù)量應(yīng)相對較少(每個Session bean 中僅有約 24 個)。
  它們是底層系統(tǒng)的客戶端接口。它們應(yīng)該把特定于子系統(tǒng)的信息封裝起來,并且不應(yīng)該在不必要的情況下公開它。
  那么它的工作機(jī)制呢?您還能代理別的哪些類型的對象呢?這又會給您的設(shè)計(jì)帶來什么好處呢?在我的一篇早期論文和 [Brown 2001] 這本書中,我已論述了其中一些問題,在那里可以找到一些具體信息。但,總的來說,在我的多數(shù) EJB 設(shè)計(jì)中我通常會找到以下四類對象:
  
  值對象是包含了客戶機(jī)所請求的數(shù)據(jù)的、可序列化的 Java bean。它包含Entity bean 和其他數(shù)據(jù)源所包含的數(shù)據(jù)的一個子集。它是Session EJB 方法的返回類型。[EJB 2.0] 和 [Sun 2001] 都描述了值對象和值對象的用途。請注重 [Fowler 2001] 稱其為“數(shù)據(jù)傳輸對象”( Data Transfer Objects ),[Brown 1999] 也使用這個名稱。我個人覺得數(shù)據(jù)傳輸對象是描述性更好的術(shù)語,但不幸的是,Sun 的術(shù)語似乎更通用。
  對象制造廠 (Factory) [Brown 1999] [Brown 2000] 負(fù)責(zé)構(gòu)建值對象。它能完成辨別不同的數(shù)據(jù)源、創(chuàng)建值對象的實(shí)例、填充值對象的實(shí)例等等工作。每個 factory 類 都可以從多個數(shù)據(jù)源中檢索數(shù)據(jù)或更新其中的數(shù)據(jù)。在您的對象模型中,每個“根”對象都應(yīng)該有一個 factory 類。(根對象是那些“包含”其它對象的對象。)從某種意義上說,對象 Factory 類在 JDBC 或持久的 Entity bean 子系統(tǒng)上擔(dān)當(dāng) Facade,實(shí)現(xiàn) [Gamma] 中提到的分層原則。
  Entity EJB 應(yīng)該是標(biāo)準(zhǔn)的、企業(yè)全局范圍內(nèi)可用的“數(shù)據(jù)源”。Entity bean 不應(yīng)包含特定于應(yīng)用程序的域邏輯,也不應(yīng)限制為只能在單一應(yīng)用程序內(nèi)工作。請注重Entity bean 是可選的,它不是這種體系結(jié)構(gòu)中必需的部分;Factory 可能像 JMS 隊(duì)列或 JDBC 連接那樣簡單地直接從數(shù)據(jù)源獲取數(shù)據(jù)。
  Action 對象是Session bean 可能調(diào)用的唯一對商業(yè)業(yè)務(wù)進(jìn)行處理的對象。Action 對象只處理與簡單的創(chuàng)建、讀取、更新或刪除數(shù)據(jù)無關(guān)的商業(yè)流程。和對象 Factory 一樣,Action 對象也充當(dāng)內(nèi)層 Facade。
  
  一個 EJB 對象示例
  描述類似這樣的模式碰到的一個問題是,能夠使用這種模式的示例都太大,以至于無法包含在模式自身的描述中。盡管如此,我還是要嘗試舉出如下示例(它顯然很簡單)來說明一下這些對象看起來是什么樣子。
  
  假設(shè)我們正在為銀行構(gòu)建一個 ATM 系統(tǒng)。這是最老掉牙的 OO 設(shè)計(jì)問題之一,當(dāng)然其它很多書籍和論文已經(jīng)討論過它,但它確實(shí)有足夠符合我們要求的有趣特點(diǎn)。通過分析,我們發(fā)現(xiàn)了兩種 EJB。
  
  從 ATM 到銀行的連接表示為Session bean。該 bean 上有一些方法負(fù)責(zé)處理您通過 ATM 可以完成的交易 ? 存款、取款以及帳戶間的資金轉(zhuǎn)移。
  帳戶表示為Entity bean(我們的示例采用 CMP,但它在我們的示例中實(shí)際上并沒什么影響)表示。它有返回帳戶余額、對帳戶進(jìn)行借貸處理的方法。
  ATM Session bean 的遠(yuǎn)程接口如下:
  
  package com.ibm.bankexample.ejbs;
  
  import com.ibm.bankexampl

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安西县| 文昌市| 闽侯县| 中西区| 同心县| 永安市| 喀什市| 富川| 曲阳县| 延长县| 桦川县| 长沙县| 长武县| 太和县| 海盐县| 云和县| 湛江市| 固安县| 稷山县| 饶阳县| 罗城| 金阳县| 台南市| 红安县| 合肥市| 沐川县| 罗山县| 玉屏| 上高县| 泌阳县| 昌邑市| 镇原县| 茶陵县| 平潭县| 昌都县| 平阳县| 郧西县| 来宾市| 蕲春县| 固镇县| 盐源县|