摘要:在軟件系統(tǒng)中,某些類型由于自身的邏輯,它具有兩個(gè)或兩個(gè)以上的維度變化,那么如何應(yīng)對(duì)這種“多維度的變化”呢?如何利用面向?qū)ο蟮募夹g(shù)來使得該類型能夠輕松的沿著多個(gè)方向進(jìn)行變化,而又不引入額外的復(fù)雜度呢?這就是橋接模式(Bridge)。
關(guān)鍵詞:設(shè)計(jì)模式;橋接模式;模式擴(kuò)展
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2013)02-0433-02
設(shè)計(jì)模式(Design pattern)這個(gè)術(shù)語(yǔ)是由“四人幫”,又稱Gang of Four,即Erich Gamma, Richard Helm, Ralph Johnson & John Vlissides四人在1990年代從建筑設(shè)計(jì)領(lǐng)域引入到計(jì)算機(jī)科學(xué)的,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。它是對(duì)軟件設(shè)計(jì)中普遍存在(反復(fù)出現(xiàn))的各種問題,所提出的解決方案。設(shè)計(jì)模式并不直接用來完成程式碼的編寫,而是描述在各種不同情況下,要怎么解決問題的一種方案。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
1 橋接模式
橋接模式(Bridge Pattern):將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。它是一種對(duì)象結(jié)構(gòu)型模式,又稱為柄體(Handle and Body)模式或接口(Interface)模式。(Bridge Pattern: Decouple an abstraction from its implementation so that the two can vary independently.)
結(jié)構(gòu)如下:
Abstraction:定義抽象的接口。該接口包含實(shí)現(xiàn)具體行為、具體特征的Implementor接口;
Refined Abstraction:抽象接口Abstraction的子類,依舊是一個(gè)抽象的事物名;
Implementor:定義具體行為、具體特征的應(yīng)用接口;
ConcreteImplementor:實(shí)現(xiàn)Implementor接口。
2 模式分析
理解橋接模式,重點(diǎn)需要理解如何將抽象化(Abstraction)與實(shí)現(xiàn)化(Implementation)脫耦,使得二者可以獨(dú)立地變化。
抽象化:抽象化就是忽略一些信息,把不同的實(shí)體當(dāng)作同樣的實(shí)體對(duì)待。在面向?qū)ο笾?,將?duì)象的共同性質(zhì)抽取出來形成類的過程即為抽象化的過程。
實(shí)現(xiàn)化:針對(duì)抽象化給出的具體實(shí)現(xiàn),就是實(shí)現(xiàn)化,抽象化與實(shí)現(xiàn)化是一對(duì)互逆的概念,實(shí)現(xiàn)化產(chǎn)生的對(duì)象比抽象化更具體,是對(duì)抽象化事物的進(jìn)一步具體化的產(chǎn)物。
脫耦:脫耦就是將抽象化和實(shí)現(xiàn)化之間的耦合解脫開,或者說是將它們之間的強(qiáng)關(guān)聯(lián)改換成弱關(guān)聯(lián),將兩個(gè)角色之間的繼承關(guān)系改為關(guān)聯(lián)關(guān)系。橋接模式中的所謂脫耦,就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用關(guān)聯(lián)關(guān)系(組合或者聚合關(guān)系)而不是繼承關(guān)系,從而使兩者可以相對(duì)獨(dú)立地變化,這就是橋接模式的用意。
3 模式優(yōu)點(diǎn)
分離抽象和實(shí)現(xiàn)部分。橋接模式分離了抽象部分和實(shí)現(xiàn)部分,從而極大地提高了系統(tǒng)的靈活性。讓抽象部分和實(shí)現(xiàn)部分獨(dú)立開來,分別定義接口,這有助于對(duì)系統(tǒng)進(jìn)行分層,從而產(chǎn)生更好的結(jié)構(gòu)化的系統(tǒng)。對(duì)于系統(tǒng)的高層部分,只需要知道抽象部分和實(shí)現(xiàn)部分的接口就可以了。
更好的擴(kuò)展性。由于橋接模式把抽象部分和實(shí)現(xiàn)部分分離開了,而且分別定義接口,這就使得抽象部分和實(shí)現(xiàn)部分可以分別獨(dú)立地?cái)U(kuò)展,而不會(huì)相互影響,從而大大地提高了系統(tǒng)的可擴(kuò)展性。
可動(dòng)態(tài)地切換實(shí)現(xiàn)。由于橋接模式把抽象部分和實(shí)現(xiàn)部分分離開了,所以在實(shí)現(xiàn)橋接的時(shí)候,就可以實(shí)現(xiàn)動(dòng)態(tài)的選擇和使用具體的實(shí)現(xiàn)。也就是說一個(gè)實(shí)現(xiàn)不再是固定的綁定在一個(gè)抽象接口上了,可以實(shí)現(xiàn)運(yùn)行期間動(dòng)態(tài)地切換。
可減少子類的個(gè)數(shù)。根據(jù)前面的講述,對(duì)于有兩個(gè)變化緯度的情況,如果采用繼承的實(shí)現(xiàn)方式,大約需要兩個(gè)緯度上的可變化數(shù)量的乘積個(gè)子類;而采用橋接模式來實(shí)現(xiàn),大約需要兩個(gè)緯度上的可變化數(shù)量的和個(gè)子類??梢悦黠@地減少子類的個(gè)數(shù)。
4 橋接模式的缺點(diǎn)
橋接模式的引入會(huì)增加系統(tǒng)的理解與設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對(duì)抽象進(jìn)行設(shè)計(jì)與編程。橋接模式要求正確識(shí)別出系統(tǒng)中兩個(gè)獨(dú)立變化的維度,因此其使用范圍具有一定的局限性。
適用環(huán)境:如果你不希望在抽象部分和實(shí)現(xiàn)部分采用固定的綁定關(guān)系,可以采用橋接模式,來把抽象部分和實(shí)現(xiàn)部分分開,然后在程序運(yùn)行期間來動(dòng)態(tài)地設(shè)置抽象部分需要用到的具體的實(shí)現(xiàn),還可以動(dòng)態(tài)地切換具體的實(shí)現(xiàn)。如果出現(xiàn)抽象部分和實(shí)現(xiàn)部分都能夠擴(kuò)展的情況,可以采用橋接模式,讓抽象部分和實(shí)現(xiàn)部分獨(dú)立地變化,從而靈活地進(jìn)行單獨(dú)擴(kuò)展,而不是攪在一起,擴(kuò)展一邊就會(huì)影響到另一邊。如果希望實(shí)現(xiàn)部分的修改不會(huì)對(duì)客戶產(chǎn)生影響,可以采用橋接模式。由于客戶是面向抽象的接口在運(yùn)行,實(shí)現(xiàn)部分的修改可以獨(dú)立于抽象部分,并不會(huì)對(duì)客戶產(chǎn)生影響,也可以說對(duì)客戶是透明的。如果采用繼承的實(shí)現(xiàn)方案,會(huì)導(dǎo)致產(chǎn)生很多子類,對(duì)于這種情況,可以考慮采用橋接模式,分析功能變化的原因,看看是否能分離成不同的緯度,然后通過橋接模式來分離它們,從而減少子類的數(shù)目。
5 模式擴(kuò)展
適配器模式與橋接模式。橋接模式和適配器模式用于設(shè)計(jì)的不同階段,橋接模式用于系統(tǒng)的初步設(shè)計(jì),對(duì)于存在兩個(gè)獨(dú)立變化維度的類可以將其分為抽象化和實(shí)現(xiàn)化兩個(gè)角色,使它們可以分別進(jìn)行變化;而在初步設(shè)計(jì)完成之后,當(dāng)發(fā)現(xiàn)系統(tǒng)與已有類無法協(xié)同工作時(shí),可以采用適配器模式。但有時(shí)候在設(shè)計(jì)初期也需要考慮適配器模式,特別是那些涉及到大量第三方應(yīng)用接口的情況。橋接模式和策略模式。這兩個(gè)模式有很大的相似之處。
如果把橋接模式的抽象部分簡(jiǎn)化來看,暫時(shí)不去擴(kuò)展Abstraction,也就是去掉RefinedAbstraction。這兩個(gè)模式雖然相似,但也還是有區(qū)別的。最主要的是模式的目的不一樣,策略模式的目的是封裝一系列的算法,使得這些算法可以相互替換;而橋接模式的目的是分離抽象部分和實(shí)現(xiàn)部分,使得它們可以獨(dú)立地變化。通過上面的結(jié)構(gòu)圖,可以體會(huì)到橋接模式和策略模式是如此相似??梢园巡呗阅J降腃ontext當(dāng)做是使用接口的對(duì)象,而Strategy就是某個(gè)接口了,具體的策略實(shí)現(xiàn)就相當(dāng)于接口的具體實(shí)現(xiàn)。這樣看來的話,某些情況下,可以使用橋接模式來模擬實(shí)現(xiàn)策略模式的功能。
橋接模式和狀態(tài)模式。由于從模式結(jié)構(gòu)上看,狀態(tài)模式和策略模式是一樣的,因此這兩個(gè)模式的關(guān)系也基本上類似于橋接模式和策略模式的關(guān)系。只不過狀態(tài)模式的目的是封裝狀態(tài)對(duì)應(yīng)的行為,并在內(nèi)部狀態(tài)改變的時(shí)候改變對(duì)象的行為。
橋接模式和模板方法模式。這兩個(gè)模式有相似之處。雖然標(biāo)準(zhǔn)的模板方法模式是采用繼承來實(shí)現(xiàn)的,但是模板方法也可以通過回調(diào)接口的方式來實(shí)現(xiàn)。如果把接口的實(shí)現(xiàn)獨(dú)立出去,那就類似于模板方法通過接口去調(diào)用具體的實(shí)現(xiàn)方法了,這樣的結(jié)構(gòu)就和簡(jiǎn)化的橋接模式類似了??梢允褂脴蚪幽J絹砟M實(shí)現(xiàn)模板方法模式的功能。如果在實(shí)現(xiàn)Abstraction對(duì)象的時(shí)候,在其中定義方法,方法中就是某個(gè)固定的算法骨架,也就是說這個(gè)方法就相當(dāng)于模板方法。在模板方法模式中,是把不能確定實(shí)現(xiàn)的步驟延遲到子類去實(shí)現(xiàn);現(xiàn)在在橋接模式中,把不能確定實(shí)現(xiàn)的步驟委托給具體實(shí)現(xiàn)部分去完成,通過回調(diào)實(shí)現(xiàn)部分的接口,來完成算法骨架中的某些步驟。這樣一來,就可以實(shí)現(xiàn)使用橋接模式來模擬實(shí)現(xiàn)模板方法模式的功能。
使用橋接模式來模擬實(shí)現(xiàn)模板方法模式的功能,還有一個(gè)潛在的好處,就是模板方法也可以很方便地?cái)U(kuò)展和變化。在標(biāo)準(zhǔn)的模板方法中,一個(gè)問題就是當(dāng)模板發(fā)生變化的時(shí)候,所有的子類都要變化,非常不方便。而使用橋接模式來實(shí)現(xiàn)類似的功能,就沒有這個(gè)問題。
另外,這里只是說從實(shí)現(xiàn)具體的業(yè)務(wù)功能上,橋接模式可以模擬實(shí)現(xiàn)模板方法模式能實(shí)現(xiàn)的功能,并不是說橋接模式和模板方法模式就變成一樣的,或者是橋接模式就可以替換模板方法模式了。要注意它們本身的功能、目的、本質(zhì)思想都是不一樣的。
橋接模式和抽象工廠模式。這兩個(gè)模式可以組合使用。橋接模式中,抽象部分需要獲取相應(yīng)的實(shí)現(xiàn)部分的接口對(duì)象,那么誰(shuí)來創(chuàng)建實(shí)現(xiàn)部分的具體實(shí)現(xiàn)對(duì)象呢?這就是抽象工廠模式派上用場(chǎng)的地方。也就是使用抽象工廠模式來創(chuàng)建和配置一個(gè)特定的具體的實(shí)現(xiàn)對(duì)象。
事實(shí)上,抽象工廠主要是用來創(chuàng)建一系列對(duì)象的,如果創(chuàng)建的對(duì)象很少,或者是很簡(jiǎn)單,還可以采用簡(jiǎn)單工廠,也能達(dá)到同樣的效果,但是會(huì)比抽象工廠來得簡(jiǎn)單。
橋接模式和適配器模式。這兩個(gè)模式可以組合使用。這兩個(gè)模式功能是完全不一樣的,適配器模式的功能主要是用來幫助無
關(guān)的類協(xié)同工作,重點(diǎn)在解決原本由于接口不兼容而不能一起工作的那些類,使得它們可以一起工作。而橋接模式則重點(diǎn)在分離抽象部分和實(shí)現(xiàn)部分。所以在使用上,通常在系統(tǒng)設(shè)計(jì)完成以后,才會(huì)考慮使用適配器模式;而橋接模式。是在系統(tǒng)開始的時(shí)候就要考慮使用。雖然功能上不一樣,這兩個(gè)模式還是可以組合使用的,比如,已有實(shí)現(xiàn)部分的接口,但是有些不太適應(yīng)現(xiàn)在新的功能對(duì)接口的需要,完全拋棄吧,有些功能還用得上,該怎么辦呢?那就使用適配器來進(jìn)行適配,使得舊的接口能夠適應(yīng)新的功能的需要。
6 橋接模式用途
適用在需要跨多平臺(tái)的圖形和窗口系統(tǒng)。當(dāng)需要用不同的方式改變接口和實(shí)現(xiàn)時(shí)。通過上述的介紹,我們了解為什么需要橋接模式(Bridge)和如何使用橋接模式(Bridge),由于對(duì)象的多維度的變化,使得難以決定變化時(shí),我們可以把對(duì)象和變化抽象出來。
如果我們的對(duì)象依賴于抽象,對(duì)于具體的實(shí)現(xiàn)并不關(guān)心,我們可以通過對(duì)象組合,組合出我們想要的對(duì)象。橋接模式符合OCP(對(duì)于擴(kuò)展開發(fā),對(duì)于修改關(guān)閉)設(shè)計(jì)模式的原則。
參考文獻(xiàn):
[1] 柳小文.設(shè)計(jì)模式研究及應(yīng)用[D]. 中南大學(xué),2007.
[2] 王天邑.設(shè)計(jì)模式的國(guó)內(nèi)外研究現(xiàn)狀[J]. 軟酷快訊,2012(5).
[3] 崇明, 黃洪.設(shè)計(jì)模式在倉(cāng)庫(kù)管理系統(tǒng)中的研究與應(yīng)用[J]. 成都信息工程學(xué)院學(xué)報(bào),2006(1).