溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何分析J2EE體系架構(gòu)設(shè)計(jì)中的會(huì)話面和數(shù)據(jù)訪問(wèn)對(duì)象

發(fā)布時(shí)間:2022-01-11 13:20:47 來(lái)源:億速云 閱讀:146 作者:柒染 欄目:編程語(yǔ)言

這篇文章給大家介紹如何分析J2EE體系架構(gòu)設(shè)計(jì)中的會(huì)話面和數(shù)據(jù)訪問(wèn)對(duì)象,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

圖1中的類圖簡(jiǎn)要描述了會(huì)話面的設(shè)計(jì)模式,圖2給出了會(huì)話面的序列表示,即參與組件及其交互關(guān)系。

如何分析J2EE體系架構(gòu)設(shè)計(jì)中的會(huì)話面和數(shù)據(jù)訪問(wèn)對(duì)象

圖1 會(huì)話面類圖

如何分析J2EE體系架構(gòu)設(shè)計(jì)中的會(huì)話面和數(shù)據(jù)訪問(wèn)對(duì)象

圖2會(huì)話面序列圖

這里我們對(duì)于圖7的各個(gè)組件加以簡(jiǎn)要的介紹:

(1)客戶(Client)。這表示會(huì)話面的客戶,即需要訪問(wèn)相關(guān)企業(yè)服務(wù)的客戶端應(yīng)用程序,當(dāng)然也可以是在同一層面或不同層面的另外一個(gè)會(huì)話bean。

(2)會(huì)話面(Session Facade)。會(huì)話面通常是用會(huì)話bean來(lái)實(shí)現(xiàn)的,它管理著多個(gè)企業(yè)對(duì)象的作用關(guān)系并提供一個(gè)高層次的抽象界面給用戶。

(3)業(yè)務(wù)對(duì)象(Business Object)。業(yè)務(wù)對(duì)象是一個(gè)可以使用多個(gè)不同設(shè)計(jì)方案的對(duì)象,例如會(huì)話bean、實(shí)體bean和數(shù)據(jù)訪問(wèn)對(duì)象。在圖1中業(yè)務(wù)對(duì)象負(fù)責(zé)提供數(shù)據(jù)和服務(wù),而會(huì)話面則需要與多個(gè)業(yè)務(wù)對(duì)象實(shí)例交互而獲得相應(yīng)的服務(wù)。

會(huì)話面實(shí)際上就是業(yè)務(wù)層的一個(gè)控制對(duì)象,它負(fù)責(zé)控制用戶與企業(yè)數(shù)據(jù)和企業(yè)服務(wù)對(duì)象之間的交互;在一個(gè)復(fù)雜的應(yīng)用系統(tǒng)中,甚至可能會(huì)有多個(gè)會(huì)話面作為用戶和對(duì)象模塊之間的中介。

下面介紹兩種實(shí)現(xiàn)會(huì)話面的常見(jiàn)方法。

(1)無(wú)狀態(tài)的會(huì)話面

在實(shí)現(xiàn)會(huì)話面的時(shí)候,首先應(yīng)該決定是用狀態(tài)化還是無(wú)狀態(tài)的會(huì)話bean來(lái)實(shí)現(xiàn),這主要取決于會(huì)話面所建模的業(yè)務(wù)流程;如果一個(gè)業(yè)務(wù)流程只需要一次方法調(diào)用就可以實(shí)現(xiàn)其服務(wù),那么就可以使用無(wú)狀態(tài)的會(huì)話bean來(lái)實(shí)現(xiàn)它。

(2)狀態(tài)化的會(huì)話面

當(dāng)一個(gè)業(yè)務(wù)流程需要多次方法調(diào)用來(lái)實(shí)現(xiàn)其服務(wù)時(shí),開(kāi)發(fā)人員使用狀態(tài)化的會(huì)話bean來(lái)實(shí)現(xiàn)這過(guò)程,因?yàn)槊看畏椒ㄕ{(diào)用的狀態(tài)信息都必須在會(huì)話bean中保存。

通過(guò)在應(yīng)用系統(tǒng)中采用會(huì)話面的設(shè)計(jì)模式,將在系統(tǒng)中得到以下的收益:

①為用戶提供一個(gè)簡(jiǎn)單的接口,并隱藏所有與系統(tǒng)組件復(fù)雜的交互過(guò)程;

②減少暴露給用戶的企業(yè)對(duì)象,從而降低它們之間的依賴關(guān)系;

③向用戶隱藏系統(tǒng)組件間的交互過(guò)程和依賴關(guān)系,從而使得系統(tǒng)更加容易管理,并提供相當(dāng)?shù)撵`活性;提供一套統(tǒng)一的用戶訪問(wèn)機(jī)制,便于管理用戶對(duì)于系統(tǒng)服務(wù)的請(qǐng)求與訪問(wèn)。

6、 數(shù)據(jù)訪問(wèn)對(duì)象

數(shù)據(jù)訪問(wèn)對(duì)象(data access object,DAO)模式將數(shù)據(jù)訪問(wèn)邏輯抽象為特殊的資源,也就是說(shuō)將系統(tǒng)資源的接口從其底層訪問(wèn)機(jī)制中隔離出來(lái);通過(guò)將數(shù)據(jù)訪問(wèn)的調(diào)用打包,數(shù)據(jù)訪問(wèn)對(duì)象可以促進(jìn)對(duì)于不同數(shù)據(jù)庫(kù)類型和模式的數(shù)據(jù)訪問(wèn)。

這種模式出現(xiàn)的背景在于數(shù)據(jù)訪問(wèn)的邏輯極大程度上取決于數(shù)據(jù)存儲(chǔ)的格式,比如說(shuō)關(guān)系型數(shù)據(jù)庫(kù)、面向?qū)ο髷?shù)據(jù)庫(kù)、磁盤(pán)文件等。

目前大部分的J2EE應(yīng)用程序都需要在一定程度上使用可持久性的數(shù)據(jù),而實(shí)現(xiàn)持久性數(shù)據(jù)的方法因應(yīng)用程序不同而異,并且訪問(wèn)不同存儲(chǔ)格式數(shù)據(jù)的應(yīng)用程序接口(API)也有著顯著的差別;有的時(shí)候,應(yīng)用程序還會(huì)訪問(wèn)存儲(chǔ)在不同操作平臺(tái)上的數(shù)據(jù),這使得問(wèn)題更為復(fù)雜,通常,應(yīng)用程序會(huì)使用共享的分布式組件,如實(shí)體bean來(lái)表達(dá)持久性數(shù)據(jù)。應(yīng)用程序可以使用bean管理的持久性實(shí)體bean,而在實(shí)體bean中植人數(shù)據(jù)訪問(wèn)邏輯,或者使用容器管理的持久性實(shí)體bean,從而使容器管理所有的事務(wù)和持久性細(xì)節(jié);而如果應(yīng)用程序?qū)τ跀?shù)據(jù)訪問(wèn)的需求十分簡(jiǎn)單的話,也可以采用會(huì)話bean或Servlet直接訪問(wèn)持久性存儲(chǔ)來(lái)讀取和修改數(shù)據(jù)。

一些應(yīng)用程序可以使用JDBC應(yīng)用程序接口來(lái)訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù),JDBC負(fù)責(zé)一般的持久性數(shù)據(jù)訪問(wèn)和管理,在J2EE應(yīng)用程序中,JDBC中可以嵌入SQL語(yǔ)句,用以訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù),當(dāng)然根據(jù)數(shù)據(jù)庫(kù)類型的不同,SQL語(yǔ)句的詞法和語(yǔ)法也會(huì)有所不同;需要說(shuō)明的是,當(dāng)數(shù)據(jù)存儲(chǔ)格式不同的時(shí)候,數(shù)據(jù)訪問(wèn)邏輯的區(qū)別就更加明顯了,例如關(guān)系型數(shù)據(jù)庫(kù)、面向?qū)ο髷?shù)據(jù)庫(kù)和磁盤(pán)文件,各自數(shù)據(jù)的訪問(wèn)邏輯各有千秋,這樣一來(lái)就造成了程序代碼和數(shù)據(jù)訪問(wèn)代碼之間的依賴關(guān)系;當(dāng)程序組件,即實(shí)體bean、會(huì)話bean或servlet、JSP等需要訪問(wèn)數(shù)據(jù)源時(shí),它們會(huì)使用正確的應(yīng)用程序接口來(lái)得到連接并管理數(shù)據(jù)源,但這樣也會(huì)造成這些組件與數(shù)據(jù)源物理實(shí)現(xiàn)之間的依賴關(guān)系,從而使得應(yīng)用程序很難從一個(gè)數(shù)據(jù)存儲(chǔ)實(shí)體移植到另一個(gè)數(shù)據(jù)存儲(chǔ)實(shí)體中去;當(dāng)數(shù)據(jù)源的物理實(shí)現(xiàn)變化的時(shí)候,應(yīng)用程序也必須相應(yīng)地加以改變。

基于以上所討論的問(wèn)題,開(kāi)發(fā)人員開(kāi)始采用數(shù)據(jù)訪問(wèn)對(duì)象的方法。數(shù)據(jù)訪問(wèn)對(duì)象實(shí)際上就是包含對(duì)于所有數(shù)據(jù)訪問(wèn)邏輯的對(duì)象,并管理著對(duì)于數(shù)據(jù)源的連接,根據(jù)數(shù)據(jù)源的不同,數(shù)據(jù)訪問(wèn)對(duì)象實(shí)現(xiàn)了不同的訪問(wèn)機(jī)制,這里所說(shuō)的數(shù)據(jù)源可以是持久性存儲(chǔ)介質(zhì),如關(guān)系型數(shù)據(jù)庫(kù),也可以是外部服務(wù),如B2B的數(shù)據(jù)交換;不僅是用戶,而且包括應(yīng)用系統(tǒng)中的其他組件,也可以使用數(shù)據(jù)訪問(wèn)對(duì)象所提供的數(shù)據(jù)訪問(wèn)接口,數(shù)據(jù)訪問(wèn)對(duì)象將數(shù)據(jù)源的物理實(shí)現(xiàn)細(xì)節(jié)與其用戶完全分離開(kāi)來(lái),并且在底層數(shù)據(jù)源變化的時(shí)候,數(shù)據(jù)訪問(wèn)對(duì)象向用戶提供的接口是不會(huì)變化的;這種方法使應(yīng)用系統(tǒng)使用數(shù)據(jù)訪問(wèn)對(duì)象時(shí)可以適應(yīng)多種數(shù)據(jù)存儲(chǔ)介質(zhì),總之,數(shù)據(jù)訪問(wèn)對(duì)象就是系統(tǒng)組件和數(shù)據(jù)源中間的適配器。

圖3中的類圖表示了數(shù)據(jù)訪問(wèn)對(duì)象設(shè)計(jì)模式的參與對(duì)象和之間的調(diào)用關(guān)系,圖4是這種設(shè)計(jì)模式的序列圖。

如何分析J2EE體系架構(gòu)設(shè)計(jì)中的會(huì)話面和數(shù)據(jù)訪問(wèn)對(duì)象

圖3數(shù)據(jù)訪問(wèn)對(duì)象類圖

如何分析J2EE體系架構(gòu)設(shè)計(jì)中的會(huì)話面和數(shù)據(jù)訪問(wèn)對(duì)象

圖4數(shù)據(jù)訪問(wèn)對(duì)象序列圖

對(duì)于圖9序列圖中的組件加以解釋如下:

(1)業(yè)務(wù)對(duì)象(Business Object)。表示數(shù)據(jù)的用戶,它需要對(duì)于數(shù)據(jù)的訪問(wèn),一個(gè)業(yè)務(wù)對(duì)象可以用會(huì)話bean、實(shí)體bean或是其他Java程序來(lái)實(shí)現(xiàn)。

(2)數(shù)據(jù)訪問(wèn)對(duì)象(Data Access Object)。數(shù)據(jù)訪問(wèn)對(duì)象是這種模式中的主題,它提供了底層數(shù)據(jù)訪問(wèn)的對(duì)象,并將其提供給業(yè)務(wù)對(duì)象以使得后者能夠透明地訪問(wèn)數(shù)據(jù)源;同時(shí)業(yè)務(wù)對(duì)象也將數(shù)據(jù)的加載和存儲(chǔ)操作移交給數(shù)據(jù)訪問(wèn)對(duì)象處理。

(3)數(shù)據(jù)源(Data source)。這里指的是數(shù)據(jù)源的物理實(shí)現(xiàn),這個(gè)數(shù)據(jù)源可以是一個(gè)數(shù)據(jù)庫(kù),包括關(guān)系型數(shù)據(jù)庫(kù)、面向?qū)ο髷?shù)據(jù)庫(kù)或文件系統(tǒng)。

(4)傳輸對(duì)象(Transfer Object)。這里的傳輸對(duì)象指的是數(shù)據(jù)載體。數(shù)據(jù)訪問(wèn)對(duì)象可以使用傳輸對(duì)象來(lái)向用戶返回?cái)?shù)據(jù),而數(shù)據(jù)訪問(wèn)對(duì)象同樣可以從用戶那里得到傳輸對(duì)象來(lái)對(duì)數(shù)據(jù)源中的數(shù)據(jù)進(jìn)行更新。

下面給出幾種實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)對(duì)象設(shè)計(jì)模式的方法。

(1)自動(dòng)數(shù)據(jù)訪問(wèn)對(duì)象代碼的生成

既然每一個(gè)業(yè)務(wù)對(duì)象都對(duì)應(yīng)于一個(gè)數(shù)據(jù)訪問(wèn)對(duì)象,那么開(kāi)發(fā)人員就可以建立業(yè)務(wù)對(duì)象、數(shù)據(jù)訪問(wèn)對(duì)象和底層實(shí)現(xiàn)的關(guān)系;一旦這種關(guān)系建立起來(lái),開(kāi)發(fā)人員就可以為所有的數(shù)據(jù)訪問(wèn)對(duì)象編寫(xiě)特殊的代碼生成工具。

生成數(shù)據(jù)訪問(wèn)對(duì)象的信息通常存儲(chǔ)在一個(gè)開(kāi)發(fā)人員定義的描述文件中,如果對(duì)于數(shù)據(jù)訪問(wèn)對(duì)象的要求過(guò)于復(fù)雜,開(kāi)發(fā)人員可以考慮使用第三方工具來(lái)為關(guān)系型數(shù)據(jù)庫(kù)提供對(duì)象對(duì)關(guān)系的映射。這些工具通常是一些GUI程序,可以用來(lái)將業(yè)務(wù)對(duì)象映射為持久性的存儲(chǔ)對(duì)象,并定義中間運(yùn)作的數(shù)據(jù)訪問(wèn)對(duì)象,在映射完成的時(shí)候,這些工具可以自動(dòng)地生成代碼,并提供一些相應(yīng)的功能,如緩存結(jié)果、緩存查詢、與應(yīng)用服務(wù)器整合、與第三方產(chǎn)品整合等。

(2)數(shù)據(jù)訪問(wèn)對(duì)象代理(Factory for Data Access Objects)

當(dāng)?shù)讓拥臄?shù)據(jù)存儲(chǔ)不會(huì)輕易改變的時(shí)候,開(kāi)發(fā)人員可以采取這種方法來(lái)實(shí)現(xiàn)相應(yīng)的,數(shù)據(jù)訪問(wèn)對(duì)象,圖5是這種方法的類圖。

如何分析J2EE體系架構(gòu)設(shè)計(jì)中的會(huì)話面和數(shù)據(jù)訪問(wèn)對(duì)象

圖5 使用DAO代理類圖

當(dāng)?shù)讓拥臄?shù)據(jù)存儲(chǔ)可能會(huì)變化的時(shí)候,開(kāi)發(fā)人員可以采用抽象代理的方法來(lái)實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)對(duì)象;抽象代理的方法會(huì)創(chuàng)建一些虛擬的數(shù)據(jù)訪問(wèn)對(duì)象代理和各種類型的實(shí)際數(shù)據(jù)訪問(wèn)對(duì)象代理,每種對(duì)象對(duì)應(yīng)一種持久性存儲(chǔ)介質(zhì)的實(shí)現(xiàn),一旦組件得到這些代理,就可以利用來(lái)創(chuàng)建需要使用的數(shù)據(jù)訪問(wèn)對(duì)象。

圖6給出了這種情況的類圖。該類圖表示了一個(gè)基礎(chǔ)的數(shù)據(jù)訪問(wèn)對(duì)象代理,它是一個(gè)抽象類,被其他一些實(shí)際的數(shù)據(jù)訪問(wèn)對(duì)象代理繼承以支持特定的數(shù)據(jù)訪問(wèn)函數(shù);用戶可以得到一個(gè)實(shí)際的數(shù)據(jù)訪問(wèn)對(duì)象,并利用它來(lái)創(chuàng)建需要的數(shù)據(jù)訪問(wèn)對(duì)象而訪問(wèn)相關(guān)的數(shù)據(jù),每一個(gè)實(shí)際的數(shù)據(jù)訪問(wèn)對(duì)象都負(fù)責(zé)建立對(duì)于數(shù)據(jù)源的連接,并得到和管理所支持的業(yè)務(wù)數(shù)據(jù)。

如何分析J2EE體系架構(gòu)設(shè)計(jì)中的會(huì)話面和數(shù)據(jù)訪問(wèn)對(duì)象

圖6  抽象代理使用DAO

下圖7是這種情況下的序列圖。

如何分析J2EE體系架構(gòu)設(shè)計(jì)中的會(huì)話面和數(shù)據(jù)訪問(wèn)對(duì)象

圖7抽象代理使用DAO序列圖

這種設(shè)計(jì)模式的優(yōu)勢(shì):

透明性好。業(yè)務(wù)對(duì)象可以在不知道數(shù)據(jù)源實(shí)現(xiàn)細(xì)節(jié)的情況下訪問(wèn)數(shù)據(jù)。由于一切數(shù)據(jù)訪問(wèn)細(xì)節(jié)被數(shù)據(jù)訪問(wèn)對(duì)象所隱藏,所以這種訪問(wèn)過(guò)程是透明的。

可移植性好。在應(yīng)用系統(tǒng)中添加數(shù)據(jù)訪問(wèn)對(duì)象,可以使得前者能夠很方便地移植到另外一種數(shù)據(jù)庫(kù)實(shí)現(xiàn)上。業(yè)務(wù)對(duì)象與數(shù)據(jù)實(shí)現(xiàn)是隔離的,所以在移植過(guò)程中,僅僅對(duì)數(shù)據(jù)訪問(wèn)對(duì)象進(jìn)行一些變化即可。

減少業(yè)務(wù)對(duì)象的代碼復(fù)雜度。由于數(shù)據(jù)訪問(wèn)對(duì)象可以管理所有的數(shù)據(jù)訪問(wèn)復(fù)雜細(xì)節(jié),這也就簡(jiǎn)化了業(yè)務(wù)模塊和其他數(shù)據(jù)客戶的代碼。同時(shí)也提高了應(yīng)用系統(tǒng)的整體可讀性和開(kāi)發(fā)率。

集中處理所有數(shù)據(jù)訪問(wèn)。由于所有的數(shù)據(jù)訪問(wèn)操作都移交給數(shù)據(jù)訪問(wèn)對(duì)象,這樣應(yīng)用系統(tǒng)其他部分就與數(shù)據(jù)訪問(wèn)實(shí)現(xiàn)隔離開(kāi)來(lái),而全部相關(guān)操作都與數(shù)據(jù)訪問(wèn)對(duì)象集中處理,這樣也使得相關(guān)操作更加容易被維護(hù)和管理。

這種設(shè)計(jì)模式的缺陷:

對(duì)于容器管理的持久性不能利用。如果EJB容器采取容器管理的方式,那么所有對(duì)于持久性數(shù)據(jù)存儲(chǔ)的管理都由容器負(fù)責(zé)。這樣的話應(yīng)用系統(tǒng)就無(wú)需實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)對(duì)象了,因?yàn)閼?yīng)用服務(wù)將透明地提供這一功能。

添加了額外的層面。數(shù)據(jù)訪問(wèn)對(duì)象在數(shù)據(jù)用戶和數(shù)據(jù)源之間添加了一個(gè)層面,也就增加了一些額外的設(shè)計(jì)和實(shí)現(xiàn)的負(fù)擔(dān)。當(dāng)然,我們認(rèn)為它是物有所值的。

總之,在開(kāi)發(fā)人員選擇不同模式的時(shí)候,應(yīng)該注意,一定的模式對(duì)應(yīng)于一定的應(yīng)用層次。比如說(shuō),與視圖和顯示相關(guān)的模式就是在Web層應(yīng)用的。而一些與業(yè)務(wù)邏輯控制相關(guān)的模式則是與EJB層次相關(guān)的。另外一些關(guān)于讀取數(shù)據(jù)和分派操作的模式則適用于不同的層次之間。

關(guān)于如何分析J2EE體系架構(gòu)設(shè)計(jì)中的會(huì)話面和數(shù)據(jù)訪問(wèn)對(duì)象就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI