版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、橋梁(Bridge)模式橋梁模式是一個(gè)特不有用的模式,也是比較復(fù)雜的一個(gè)模式。熟悉那個(gè)模式關(guān)于理解面向?qū)ο蟮脑O(shè)計(jì)原則,包括開(kāi)閉原則(OCP)以及組合/聚合復(fù)用原則(CARP)都專門有關(guān)心。理解好這兩個(gè)原則,有助于形成正確的設(shè)計(jì)思想和培養(yǎng)良好的設(shè)計(jì)風(fēng)格。橋梁模式的用意【GOF95】在提出橋梁模式的時(shí)候指出,橋梁模式的用意是將抽象化(Abstraction)與實(shí)現(xiàn)化(Implementation)脫耦,使得二者能夠獨(dú)立地變化。這句話有三個(gè)關(guān)鍵詞,也確實(shí)是抽象化、實(shí)現(xiàn)化和脫耦。抽象化存在于多個(gè)實(shí)體中的共同的概念性聯(lián)系,確實(shí)是抽象化。作為一個(gè)過(guò)程,抽象化確實(shí)是忽略一些信息,從而把不同的實(shí)體當(dāng)做同樣
2、的實(shí)體對(duì)待【LISKOV94】。實(shí)現(xiàn)化抽象化給出的具體實(shí)現(xiàn),確實(shí)是實(shí)現(xiàn)化。脫耦所謂耦合,確實(shí)是兩個(gè)實(shí)體的行為的某種強(qiáng)關(guān)聯(lián)。而將它們的強(qiáng)關(guān)聯(lián)去掉,確實(shí)是耦合的解脫,或稱脫耦。在那個(gè)地點(diǎn),脫耦是指將抽象化和實(shí)現(xiàn)化之間的耦合解脫開(kāi),或者講是將它們之間的強(qiáng)關(guān)聯(lián)改換成弱關(guān)聯(lián)。將兩個(gè)角色之間的繼承關(guān)系改為聚合關(guān)系,確實(shí)是將它們之間的強(qiáng)關(guān)聯(lián)改換成為弱關(guān)聯(lián)。因此,橋梁模式中的所謂脫耦,確實(shí)是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承關(guān)系,從而使兩者能夠相對(duì)獨(dú)立地變化。這確實(shí)是橋梁模式的用意。二、橋梁模式的結(jié)構(gòu)橋梁模式【GOF95】是對(duì)象的結(jié)構(gòu)模式,又稱為柄體(Handle and Bod
3、y)模式或接口(Interface)模式。下圖所示確實(shí)是一個(gè)實(shí)現(xiàn)了橋梁模式的示意性系統(tǒng)的結(jié)構(gòu)圖。能夠看出,那個(gè)系統(tǒng)含有兩個(gè)等級(jí)結(jié)構(gòu),也確實(shí)是:由抽象化角色和修正抽象化角色組成的抽象化等級(jí)結(jié)構(gòu)。 由實(shí)現(xiàn)化角色和兩個(gè)具體實(shí)現(xiàn)化角色所組成的實(shí)現(xiàn)化等級(jí)結(jié)構(gòu)。 橋梁模式所涉及的角色有:抽象化(Abstraction)角色:抽象化給出的定義,并保存一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用。 修正抽象化(Refined Abstraction)角色:擴(kuò)展抽象化角色,改變和修正父類對(duì)抽象化的定義。 實(shí)現(xiàn)化(Implementor)角色:那個(gè)角色給出實(shí)現(xiàn)化角色的接口,但不給出具體的實(shí)現(xiàn)。必須指出的是,那個(gè)接口不一定和抽象化角色的
4、接口定義相同,實(shí)際上,這兩個(gè)接口能夠特不不一樣。實(shí)現(xiàn)化角色應(yīng)當(dāng)只給出底層操作,而抽象化角色應(yīng)當(dāng)只給出基于底層操作的更高一層的操作。 具體實(shí)現(xiàn)化(Concrete Implementor)角色:那個(gè)角色給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)。 三、橋梁模式的示意性源代碼/Bridgepattern-StructuralexampleusingSystem;/AbstractionclassAbstraction/FieldsprotectedImplementorimplementor;/PropertiespublicImplementorImplementorsetimplementor=value;
5、/MethodsvirtualpublicvoidOperation()implementor.Operation();/ImplementorabstractclassImplementor/MethodsabstractpublicvoidOperation();/RefinedAbstractionclassRefinedAbstraction:Abstraction/MethodsoverridepublicvoidOperation()implementor.Operation();/ConcreteImplementorAclassConcreteImplementorA:Impl
6、ementor/MethodsoverridepublicvoidOperation()Console.WriteLine(ConcreteImplementorAOperation);/ConcreteImplementorBclassConcreteImplementorB:Implementor/MethodsoverridepublicvoidOperation()Console.WriteLine(ConcreteImplementorBOperation);/*/Clienttest/publicclassClientpublicstaticvoidMain(stringargs)
7、Abstractionabstraction=newRefinedAbstraction();/Setimplementationandcallabstraction.Implementor=newConcreteImplementorA();abstraction.Operation();/Changeimplementionandcallabstraction.Implementor=newConcreteImplementorB();abstraction.Operation();四、調(diào)制解調(diào)器問(wèn)題感受敏捷軟件開(kāi)發(fā)原則、模式與實(shí)踐中關(guān)于Bridge模式的例子專門好。(Java與模式一書(shū)3
8、3章的對(duì)變化的封裝一節(jié)也寫(xiě)得專門不錯(cuò),推舉大伙兒讀一讀。它深入的闡述了Design Patterns Explained一書(shū)中1)Design to interfaces. 2)Favor composition over inheritance. 3)Find what varies and encapsulate it的三個(gè)觀點(diǎn)。)。如圖所示,有大量的調(diào)制解調(diào)器客戶程序在使用Modem接口。Modem接口被幾個(gè)派生類HayesModem、USRoboticsModem和 EarniesModem實(shí)現(xiàn)。它專門好地遵循了OCP、LSP和DIP。當(dāng)增加新種類的調(diào)制解調(diào)器時(shí),調(diào)制解調(diào)器的客戶程序可
9、不能受阻礙。假定這種情形持續(xù)了幾年,并有許多調(diào)制解調(diào)器的客戶程序都在使用著Modem接口?,F(xiàn)出現(xiàn)了一種不撥號(hào)的調(diào)制解調(diào)器,被稱為專用調(diào)制解調(diào)器。它們位于一條專用連接的兩端。有幾個(gè)新應(yīng)用程序使用這些專用調(diào)制解調(diào)器,它們無(wú)需撥號(hào)。我們稱這些使用者為DedUser。然而,客戶希望當(dāng)前所有的調(diào)制解調(diào)器客戶程序都能夠使用這些專用調(diào)制解調(diào)器。他們不希望去更改許許多多的調(diào)制解調(diào)器客戶應(yīng)用程序,因此完全能夠讓這些調(diào)制解調(diào)器客戶程序去撥一些假 (dummy)電話號(hào)碼。假如能選擇的話,我們會(huì)把系統(tǒng)的設(shè)計(jì)更改為下圖所示的那樣。我們把撥號(hào)和通信功能分離為兩個(gè)不同的接口。原來(lái)的調(diào)制解調(diào)器實(shí)現(xiàn)這兩個(gè)接口,而調(diào)制解調(diào)器客戶
10、程序使用這兩個(gè)接口。DedUser只使用 Modem接口,而DedicateModem只實(shí)現(xiàn)Modem接口。但如此做會(huì)要求我們更改所有的調(diào)制解調(diào)器客戶程序-這是客戶不同意的。一個(gè)可能的解決方案是讓DedicatedModem從Modem派生同時(shí)把dial方法和hangup方法實(shí)現(xiàn)為空,就像下面如此:幾個(gè)月后,差不多有了大量的DedUser,現(xiàn)在客戶提出了一個(gè)新的更改。為了能撥國(guó)際電話號(hào)碼、信用卡電話、PIN標(biāo)識(shí)電話等等,必修對(duì)現(xiàn)有dial中使用char10存儲(chǔ)號(hào)碼改為能夠撥打任意長(zhǎng)度的電話號(hào)碼。顯然,所有的調(diào)制解調(diào)器客戶程序都必須更改??蛻敉饬藢?duì)調(diào)制解調(diào)器客戶程序的更改,因?yàn)樗麄儾粺o(wú)選擇。糟
11、糕的是,現(xiàn)在必須要去告訴DedUser的編寫(xiě)者,他們必須要更改他們的代碼!你能夠想象他們聽(tīng)到那個(gè)會(huì)有多快樂(lè)。本來(lái)他們是不用調(diào)用dial的。這確實(shí)是許多項(xiàng)目都會(huì)具有的那種有害的混亂依靠關(guān)系。系統(tǒng)某一部分中的一個(gè)雜湊體(kludge)創(chuàng)建了一個(gè)有害的依靠關(guān)系,最終導(dǎo)致系統(tǒng)中完全無(wú)關(guān)的部分出現(xiàn)問(wèn)題。假如使用ADAPTER模式解決最初的問(wèn)題的話,就能夠幸免那個(gè)嚴(yán)峻問(wèn)題。如圖:請(qǐng)注意,雜湊體仍然存在。適配器仍然要模擬連接狀態(tài)。然而,所有的依靠關(guān)系差不多上從適配器發(fā)起的。雜湊體和系統(tǒng)隔離,藏身于幾乎無(wú)人知曉的適配器中。BRIDGE模式看待那個(gè)問(wèn)題,還有另外一個(gè)方式?,F(xiàn)在,出現(xiàn)了另外一種切分Modem層次結(jié)
12、構(gòu)的方式。如下圖:這不是一個(gè)理想的結(jié)構(gòu)。每當(dāng)增加一款新硬件時(shí),就必須創(chuàng)建兩個(gè)新類-一個(gè)針對(duì)專用的情況,一個(gè)針對(duì)撥號(hào)的情況。每當(dāng)增加一種新連接類型時(shí),就必須創(chuàng)建3個(gè)新類,分不對(duì)應(yīng)3款不同的硬件。假如這兩個(gè)自由度全然確實(shí)是不穩(wěn)定的,那么不用多久,就會(huì)出現(xiàn)大量的派生類。在類型層次結(jié)構(gòu)具有多個(gè)自由度的情況中,BRIDGE模式通常是有用的。我們能夠把這些層次結(jié)構(gòu)分開(kāi)并通過(guò)橋把它們結(jié)合到一起,而不是把它們合并起來(lái)。如圖:我們把調(diào)制解調(diào)器類層次結(jié)構(gòu)分成兩個(gè)層次結(jié)構(gòu)。一個(gè)表示連接方法,另一個(gè)表示硬件。那個(gè)結(jié)構(gòu)盡管復(fù)雜,然而專門有味。它的創(chuàng)建可不能阻礙到調(diào)制解調(diào)器的使用者,同時(shí)還完全分離了連接策略和硬件實(shí)現(xiàn)。
13、ModemConnectController的每個(gè)派生類代表了一個(gè)新的連接策略。在那個(gè)策略的實(shí)現(xiàn)中能夠使用sendlmp、receivelmp、 diallmp和hanglmp。新imp方法的增加可不能阻礙到使用者。能夠使用ISP來(lái)給連接操縱類增加新的接口。這種做法能夠創(chuàng)建出一條遷移路徑,調(diào)制解調(diào)器的客戶程序能夠沿著這條路徑慢慢地得到一個(gè)比dial和hangup層次更高的API。五、另外一個(gè)實(shí)際應(yīng)用Bridge模式的例子該例子演示了業(yè)務(wù)對(duì)象(BusinessObject)通過(guò)Bridge模式與數(shù)據(jù)對(duì)象(DataObject)解耦。數(shù)據(jù)對(duì)象的實(shí)現(xiàn)能夠在不改變客戶端代碼的情況下動(dòng)態(tài)進(jìn)行更換。/Br
14、idgepattern-RealWorldexampleusingSystem;usingSystem.Collections;/AbstractionclassBusinessObject/FieldsprivateDataObjectdataObject;protectedstringgroup;/ConstructorspublicBusinessObject(stringgroup)this.group=group;/PropertiespublicDataObjectDataObjectsetdataObject=value;getreturndataObject;/Methodsv
15、irtualpublicvoidNext()dataObject.NextRecord();virtualpublicvoidPrior()dataObject.PriorRecord();virtualpublicvoidNew(stringname)dataObject.NewRecord(name);virtualpublicvoidDelete(stringname)dataObject.DeleteRecord(name);virtualpublicvoidShow()dataObject.ShowRecord();virtualpublicvoidShowAll()Console.
16、WriteLine(CustomerGroup:0,group);dataObject.ShowAllRecords();/RefinedAbstractionclassCustomersBusinessObject:BusinessObject/ConstructorspublicCustomersBusinessObject(stringgroup):base(group)/MethodsoverridepublicvoidShowAll()/AddseparatorlinesConsole.WriteLine();Console.WriteLine(-);base.ShowAll();C
17、onsole.WriteLine(-);/ImplementorabstractclassDataObject/MethodsabstractpublicvoidNextRecord();abstractpublicvoidPriorRecord();abstractpublicvoidNewRecord(stringname);abstractpublicvoidDeleteRecord(stringname);abstractpublicvoidShowRecord();abstractpublicvoidShowAllRecords();/ConcreteImplementorclass
18、CustomersDataObject:DataObject/FieldsprivateArrayListcustomers=newArrayList();privateintcurrent=0;/ConstructorspublicCustomersDataObject()/Loadedfromadatabasecustomers.Add(JimJones);customers.Add(SamualJackson);customers.Add(AllenGood);customers.Add(AnnStills);customers.Add(LisaGiolani);/Methodspubl
19、icoverridevoidNextRecord()if(current0)current-;publicoverridevoidNewRecord(stringname)customers.Add(name);publicoverridevoidDeleteRecord(stringname)customers.Remove(name);publicoverridevoidShowRecord()Console.WriteLine(customerscurrent);publicoverridevoidShowAllRecords()foreach(stringnameincustomers)Conso
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/ASTM TS 52949:2025 EN Additive manufacturing of metals - Qualification principles - Installation,operation and performance (IQ/OQ/PQ) of PBF-EB equipment
- 2024年秋季藝術(shù)品展銷會(huì)交易合同3篇
- 2024年私人房屋租賃管理服務(wù)合同3篇
- 笨氯苯課程設(shè)計(jì)文獻(xiàn)
- 游學(xué)課程設(shè)計(jì)培訓(xùn)總結(jié)
- 甜點(diǎn)面包烘焙 課程設(shè)計(jì)
- 環(huán)保課程設(shè)計(jì)理念有哪些
- 醫(yī)院醫(yī)療質(zhì)量安全管理制度與規(guī)范
- 研學(xué)課程設(shè)計(jì)國(guó)風(fēng)藝術(shù)
- 粽子醬的制作課程設(shè)計(jì)
- 數(shù)據(jù)中心電力設(shè)備調(diào)試方案
- 2024年度國(guó)際物流運(yùn)輸合同3篇
- 新入職員工年終工作總結(jié)課件
- 廣西南寧市第三十七中學(xué)2024-2025學(xué)年七年級(jí)上學(xué)期11月第一次月考語(yǔ)文試題(含答案)
- 2024-2025學(xué)年高二上學(xué)期期末數(shù)學(xué)試卷(基礎(chǔ)篇)(含答案)
- 2024年人力資源個(gè)人年終工作總結(jié)(6篇)
- 2024年中考物理真題及分類匯編-考點(diǎn)25:磁現(xiàn)象-電生磁
- 研究生攻讀(碩)博士學(xué)位期間擬開(kāi)展的研究計(jì)劃范文
- 中華傳統(tǒng)文化之文學(xué)瑰寶學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 靜脈導(dǎo)管維護(hù)
- 年度先進(jìn)員工選票標(biāo)準(zhǔn)格式
評(píng)論
0/150
提交評(píng)論