橋梁模式的結(jié)構(gòu)與示意性源代碼_第1頁
橋梁模式的結(jié)構(gòu)與示意性源代碼_第2頁
橋梁模式的結(jié)構(gòu)與示意性源代碼_第3頁
橋梁模式的結(jié)構(gòu)與示意性源代碼_第4頁
橋梁模式的結(jié)構(gòu)與示意性源代碼_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、一、橋梁梁(Brridgge)模模式橋梁模式是是一個非非常有用用的模式式,也是是比較復復雜的一一個模式式。熟悉悉這個模模式對于于理解面面向?qū)ο笙蟮脑O計計原則,包包括開開閉原則(OCPP)以及及組合/聚合復復用原則則(CAARP)都很有有幫助。理理解好這這兩個原原則,有有助于形形成正確確的設計計思想和和培養(yǎng)良良好的設設計風格格。橋梁模式的的用意【GOF995】在在提出橋橋梁模式式的時候候指出,橋橋梁模式式的用意意是將將抽象化化(Abbstrracttionn)與實實現(xiàn)化(Impplemmenttatiion)脫耦,使使得二者者可以獨獨立地變變化。這這句話有有三個關(guān)關(guān)鍵詞,也也就是抽抽象化、實實現(xiàn)

2、化和和脫耦。抽象化存在于多個個實體中中的共同同的概念念性聯(lián)系系,就是是抽象化化。作為為一個過過程,抽抽象化就就是忽略略一些信信息,從從而把不不同的實實體當做做同樣的的實體對對待【LLISKKOV994】。實現(xiàn)化抽象化給出出的具體體實現(xiàn),就就是實現(xiàn)現(xiàn)化。脫耦所謂耦合,就就是兩個個實體的的行為的的某種強強關(guān)聯(lián)。而而將它們們的強關(guān)關(guān)聯(lián)去掉掉,就是是耦合的的解脫,或或稱脫耦耦。在這這里,脫脫耦是指指將抽象象化和實實現(xiàn)化之之間的耦耦合解脫脫開,或或者說是是將它們們之間的的強關(guān)聯(lián)聯(lián)改換成成弱關(guān)聯(lián)聯(lián)。將兩個角色色之間的的繼承關(guān)關(guān)系改為為聚合關(guān)關(guān)系,就就是將它它們之間間的強關(guān)關(guān)聯(lián)改換換成為弱弱關(guān)聯(lián)。因因此,橋

3、橋梁模式式中的所所謂脫耦耦,就是是指在一一個軟件件系統(tǒng)的的抽象化化和實現(xiàn)現(xiàn)化之間間使用組組合/聚聚合關(guān)系系而不是是繼承關(guān)關(guān)系,從從而使兩兩者可以以相對獨獨立地變變化。這這就是橋橋梁模式式的用意意。二、橋梁梁模式的的結(jié)構(gòu)橋梁模式【GGOF995】是是對象的的結(jié)構(gòu)模模式,又又稱為柄柄體(HHanddle andd Boody)模式或或接口(Intterffacee)模式式。下圖所示就就是一個個實現(xiàn)了了橋梁模模式的示示意性系系統(tǒng)的結(jié)結(jié)構(gòu)圖??梢钥闯?,這這個系統(tǒng)統(tǒng)含有兩兩個等級級結(jié)構(gòu),也也就是:由抽象化角角色和修修正抽象象化角色色組成的的抽象化化等級結(jié)結(jié)構(gòu)。 由實現(xiàn)化角角色和兩兩個具體體實現(xiàn)化化角色所

4、所組成的的實現(xiàn)化化等級結(jié)結(jié)構(gòu)。 橋梁模式所所涉及的的角色有有:抽象化(AAbsttracctioon)角角色:抽抽象化給給出的定定義,并并保存一一個對實實現(xiàn)化對對象的引引用。 修正抽象化化(Reefinned Absstraactiion)角色:擴展抽抽象化角角色,改改變和修修正父類類對抽象象化的定定義。 實現(xiàn)化(IImpllemeentoor)角角色:這這個角色色給出實實現(xiàn)化角角色的接接口,但但不給出出具體的的實現(xiàn)。必必須指出出的是,這這個接口口不一定定和抽象象化角色色的接口口定義相相同,實實際上,這這兩個接接口可以以非常不不一樣。實實現(xiàn)化角角色應當當只給出出底層操操作,而而抽象化化角色應應

5、當只給給出基于于底層操操作的更更高一層層的操作作。 具體實現(xiàn)化化(Cooncrretee Immpleemenntorr)角色色:這個個角色給給出實現(xiàn)現(xiàn)化角色色接口的的具體實實現(xiàn)。 三、橋梁梁模式的的示意性性源代碼碼/Brridggeppattternn-SttruccturralexaamplleusiingSSysttem;/AbbstrracttionncllasssAbbstrracttionn/FiielddsprooteccteddImmpleemenntorrimmpleemenntorr;/PPropperttiesspuubliicIImpllemeentoorIImplle

6、meentoorseetimpplemmenttor=vvaluue;/MetthoddsvirrtuaalpubbliccvoiidOOperratiion()immpleemenntorr.Opperaatioon();/ImmpleemenntorrabbstrracttclaassImpplemmenttor/MeethoodsabbstrracttpubbliccvoiidOOperratiion();/ReefinnedAAbsttracctiooncclasssRRefiineddAbsstraactiion:AAbsttracctioon/Meethoodsovverrride

7、epubbliccvoiidOOperratiion()immpleemenntorr.Opperaatioon();/CooncrreteeImpplemmenttorAAcllasssCooncrreteeImpplemmenttorAA:Impplemmenttor/MeethoodsovverrrideepubbliccvoiidOOperratiion()Coonsoole.WriiteLLinee(CConccretteImmpleemenntorrAOOperratiion);/CooncrreteeImpplemmenttorBBcllasssCooncrreteeImpple

8、mmenttorBB:Impplemmenttor/MeethoodsovverrrideepubbliccvoiidOOperratiion()Coonsoole.WriiteLLinee(CConccretteImmpleemenntorrBOOperratiion);/Cllienntttestt/pubbliccclaassCliienttpuubliicstaaticcvoiidMMainn(sstriingaargss)Abbstrracttionnabbstrracttionn=newwReefinnedAAbsttracctioon();/SSetimpplemmenttati

9、ionanddcaallabsstraactiion.Impplemmenttor=nnewConncreeteIImpllemeentoorA();absstraactiion.Opeerattionn();/Chhanggeiimpllemeentiionanddcaallabsstraactiion.Impplemmenttor=nnewConncreeteIImpllemeentoorB();absstraactiion.Opeerattionn();四、調(diào)制制解調(diào)器器問題感覺敏捷捷軟件開開發(fā)原原則、模模式與實實踐中中關(guān)于BBriddge模模式的例例子很好好。(JJavaa與模式式一書

10、書33章章的對變變化的封封裝一節(jié)節(jié)也寫得得很不錯錯,推薦薦大家讀讀一讀。它它深入的的闡述了了Deesiggn PPattternns EExpllainned一一書中1)DDesiign to intterffacees. 2)FFavoor ccompposiitioon ooverr innherritaancee. 33)Fiind whaat vvariies andd enncappsullatee itt的三三個觀點點。)。如圖所示,有有大量的的調(diào)制解解調(diào)器客客戶程序序在使用用Moddem接接口。MModeem接口口被幾個個派生類類HayyesMModeem、UUSRoobotti

11、cssModdem和和 EaarniiesMModeem實現(xiàn)現(xiàn)。它很很好地遵遵循了OOCP、LLSP和和DIPP。當增增加新種種類的調(diào)調(diào)制解調(diào)調(diào)器時,調(diào)調(diào)制解調(diào)調(diào)器的客客戶程序序不會受受影響。假定這種情情形持續(xù)續(xù)了幾年年,并有有許多調(diào)調(diào)制解調(diào)調(diào)器的客客戶程序序都在使使用著MModeem接口口?,F(xiàn)出出現(xiàn)了一一種不撥撥號的調(diào)調(diào)制解調(diào)調(diào)器,被被稱為專專用調(diào)制制解調(diào)器器。它們們位于一一條專用用連接的的兩端。有有幾個新新應用程程序使用用這些專專用調(diào)制制解調(diào)器器,它們們無需撥撥號。我我們稱這這些使用用者為DDedUUserr。但是是,客戶戶希望當當前所有有的調(diào)制制解調(diào)器器客戶程程序都可可以使用用這些專專用

12、調(diào)制制解調(diào)器器。他們們不希望望去更改改許許多多多的調(diào)調(diào)制解調(diào)調(diào)器客戶戶應用程程序,所所以完全全可以讓讓這些調(diào)調(diào)制解調(diào)調(diào)器客戶戶程序去去撥一些些假 (dummmy)電話號號碼。如果能選擇擇的話,我我們會把把系統(tǒng)的的設計更更改為下下圖所示示的那樣樣。我們把撥號號和通信信功能分分離為兩兩個不同同的接口口。原來來的調(diào)制制解調(diào)器器實現(xiàn)這這兩個接接口,而而調(diào)制解解調(diào)器客客戶程序序使用這這兩個接接口。DDedUUserr只使用用 Moodemm接口,而而DeddicaateMModeem只實實現(xiàn)Moodemm接口。但但這樣做做會要求求我們更更改所有有的調(diào)制制解調(diào)器器客戶程程序-這是客客戶不允允許的。一個可能

13、的的解決方方案是讓讓DeddicaateddModdem從從Moddem派派生并且且把diial方方法和hhanggup方方法實現(xiàn)現(xiàn)為空,就就像下面面這樣:幾個月后,已已經(jīng)有了了大量的的DeddUseer,此此時客戶戶提出了了一個新新的更改改。為了了能撥國國際電話話號碼、信信用卡電電話、PPIN標標識電話話等等,必必修對現(xiàn)現(xiàn)有diial中中使用ccharr100存儲儲號碼改改為能夠夠撥打任任意長度度的電話話號碼。顯然,所有有的調(diào)制制解調(diào)器器客戶程程序都必必須更改改??蛻魬敉饬肆藢φ{(diào)制制解調(diào)器器客戶程程序的更更改,因因為他們們別無選選擇。糟糟糕的是是,現(xiàn)在在必須要要去告訴訴DeddUseer的

14、編編寫者,他他們必須須要更改改他們的的代碼!你可以以想象他他們聽到到這個會會有多高高興。本本來他們們是不用用調(diào)用ddiall的。這就是許多多項目都都會具有有的那種種有害的的混亂依依賴關(guān)系系。系統(tǒng)統(tǒng)某一部部分中的的一個雜雜湊體(kluudgee)創(chuàng)建建了一個個有害的的依賴關(guān)關(guān)系,最最終導致致系統(tǒng)中中完全無無關(guān)的部部分出現(xiàn)現(xiàn)問題。如果使用AADAPPTERR模式解解決最初初的問題題的話,就就可以避避免這個個嚴重問問題。如如圖:請注意,雜雜湊體仍仍然存在在。適配配器仍然然要模擬擬連接狀狀態(tài)。然然而,所所有的依依賴關(guān)系系都是從從適配器器發(fā)起的的。雜湊湊體和系系統(tǒng)隔離離,藏身身于幾乎乎無人知知曉的適適配

15、器中中。BRIDGGE模式式看待這個問問題,還還有另外外一個方方式?,F(xiàn)現(xiàn)在,出出現(xiàn)了另另外一種種切分MModeem層次次結(jié)構(gòu)的的方式。如如下圖:這不是一個個理想的的結(jié)構(gòu)。每每當增加加一款新新硬件時時,就必必須創(chuàng)建建兩個新新類-一個針針對專用用的情況況,一個個針對撥撥號的情情況。每每當增加加一種新新連接類類型時,就就必須創(chuàng)創(chuàng)建3個個新類,分分別對應應3款不不同的硬硬件。如如果這兩兩個自由由度根本本就是不不穩(wěn)定的的,那么么不用多多久,就就會出現(xiàn)現(xiàn)大量的的派生類類。在類型層次次結(jié)構(gòu)具具有多個個自由度度的情況況中,BBRIDDGE模模式通常常是有用用的。我我們可以以把這些些層次結(jié)結(jié)構(gòu)分開開并通過過橋把

16、它它們結(jié)合合到一起起,而不不是把它它們合并并起來。如如圖:我們把調(diào)制制解調(diào)器器類層次次結(jié)構(gòu)分分成兩個個層次結(jié)結(jié)構(gòu)。一一個表示示連接方方法,另另一個表表示硬件件。這個結(jié)構(gòu)雖雖然復雜雜,但是是很有趣趣。它的的創(chuàng)建不不會影響響到調(diào)制制解調(diào)器器的使用用者,并并且還完完全分離離了連接接策略和和硬件實實現(xiàn)。 ModdemCConnnecttConntroolleer的每每個派生生類代表表了一個個新的連連接策略略。在這這個策略略的實現(xiàn)現(xiàn)中可以以使用ssenddlmpp、reeceiivellmp、 diaallmmp和hhangglmpp。新iimp方方法的增增加不會會影響到到使用者者??梢砸允褂肐ISP來

17、來給連接接控制類類增加新新的接口口。這種種做法可可以創(chuàng)建建出一條條遷移路路徑,調(diào)調(diào)制解調(diào)調(diào)器的客客戶程序序可以沿沿著這條條路徑慢慢慢地得得到一個個比diial和和hanngupp層次更更高的AAPI。五、另外外一個實實際應用用Briidgee模式的的例子該例子演示示了業(yè)務務對象(BusinessObject)通過Bridge模式與數(shù)據(jù)對象(DataObject)解耦。數(shù)據(jù)對象的實現(xiàn)可以在不改變客戶端代碼的情況下動態(tài)進行更換。/Brridggeppattternn-ReealWorrldexaamplleussinggSyysteem;uusinngSSysttem.Colllecctioons

18、;/AbbstrracttionncllasssBuusinnesssObjjectt/FiielddspriivatteDDataaObjjecttdaataOObjeect;prooteccteddstrringggrroupp;/ConnstrructtorsspuubliicBBusiinesssObbjecct(strringggrroupp)thhis.grooup=ggrouup;/PrropeertiiespuubliicDDataaObjjecttDaataOObjeectseetdattaObbjecct=vaaluee;gettreeturrndaataOObjeect;

19、/MeethoodsviirtuualpubbliccvoiidNNextt()dattaObbjecct.NNexttReccordd();viirtuualpubbliccvoiidPPrioor()dattaObbjecct.PPrioorReecorrd();viirtuualpubbliccvoiidNNew(sttrinngnnamee)dattaObbjecct.NNewRRecoord(naame);virrtuaalpubbliccvoiidDDeleete(sttrinngnnamee)dattaObbjecct.DDeleeteRRecoord(naame);virrtu

20、aalpubbliccvoiidSShoww()dattaObbjecct.SShowwReccordd();viirtuualpubbliccvoiidSShowwAlll()Coonsoole.WriiteLLinee(CusstommerGrooup:00,grroupp);daataOObjeect.ShoowAlllReecorrds();/ReefinnedAAbsttracctiooncclasssCCusttomeersBBusiinesssObbjecct:BuusinnesssObjjectt/CoonsttrucctorrspubbliccCuustoomerrsBuus

21、innesssObjjectt(sstriinggrooup):baase(grroupp)/MetthoddsoveerriidepubbliccvoiidSShowwAlll()/AdddssepaarattorlinnesConnsolle.WWritteLiine();Connsolle.WWritteLiine(-);baase.ShoowAlll();CConssolee.WrriteeLinne(-);/ImmpleemenntorrabbstrracttclaassDattaObbjecct/MeethoodsabbstrracttpubbliccvoiidNNexttRecc

22、ordd();abbstrracttpubbliccvoiidPPrioorReecorrd();absstraactpubbliccvoiidNNewRRecoord(sttrinngnnamee);abbstrracttpubbliccvoiidDDeleeteRRecoord(sttrinngnnamee);abbstrracttpubbliccvoiidSShowwReccordd();abbstrracttpubllicvoiidSShowwAlllReccordds();/ConncreeteIImpllemeentoorcclasssCCusttomeersDDataaObjje

23、ctt:DattaObbjecct/FiielddspriivatteAArraayLiistcusstommerss=newwArrrayyLisst();priivatteinttcuurreent=00;/ConnstrructtorsspuubliicCCusttomeersDDataaObjjectt()/Looadeedffrommadattabaasecusstommerss.Addd(JiimJJonees);cusstommerss.Addd(SaamuaalJJackksonn);ccusttomeers.Addd(AlllenGoood);cusstommerss.Add

24、d(AnnnSStillls);cuustoomerrs.AAdd(LLisaaGiiolaani);/MeethoodspuubliicoveerriidevoiidNNexttReccordd()iff(ccurrrentt0)currrennt-;pubbliccoveerriidevoiidNNewRRecoord(sttrinngnnamee)cuustoomerrs.AAdd(naame);puubliicoveerriidevoiidDDeleeteRRecoord(sttrinngnnamee)cuustoomerrs.RRemoove(naame);puubliicoveerriidevoiidSShowwReccordd()Coonsoole.WriiteLLinee(ccusttomeerscuurreent);pubbliccoveerriidevoiidSShowwAlllReccordds()foreeachh(sttrinngnnameeinncusstommerss)CCon

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論