學(xué)習(xí)的過程中發(fā)現(xiàn)這兩個概念真的是有點區(qū)分不開狗超,盡管可以很感性的說bridge模式要比strategy模式更復(fù)雜更具可塑性丝格,更“高級”唠梨,但是如何清晰闡述兩者區(qū)別,卻實是有點困難柒昏。
套用偉人的一句話凳宙,站在巨人的肩膀上看得更遠,下邊三段分別來自CSDN論壇的貼子和一篇blogjava的文章职祷,看了之后令我茅塞頓開氏涩,為表尊重不在冗述,直接貼原文了堪旧。
實際上所有模式可以只分為類模式和對象模式兩種削葱,類模式是用繼承而對象模式是用委托Bridge模式和Strategy模式相似就是因為他們都將任務(wù)委托給了另外一個接口的具體實現(xiàn),他們之間的區(qū)別在于Bridge的目的是讓底層實現(xiàn)和上層接口可以分別演化淳梦,從而提高移植性而Strategy的目的是將復(fù)雜的算法封裝起來析砸,從而便于替換不同的算法。因此可以想象一般情況下Bridge的實現(xiàn)幾乎不會在運行時更改而Strategy的算法則很有可能需要在運行時更換爆袍,這就導(dǎo)致在細節(jié)方面需要考慮的因素可能會很不相同首繁。
strategy模式是為了擴展和修改作郭,并提供動態(tài)配置。它往往可以在同一環(huán)境當(dāng)中使用不同的策略弦疮,就是調(diào)用不同的派生類夹攒。其內(nèi)部實現(xiàn)是自由的,不受已有的類接口的限制(很多時候根本就不調(diào)用現(xiàn)成的接口)胁塞。bridge模式是往往是為了利用已有的方法或類咏尝。它將原來不統(tǒng)一,不兼容的接口封裝起來啸罢,變成統(tǒng)一的接口编检。它的應(yīng)用往往是不同的環(huán)境或平臺下只能選擇一 種,比如說在windows平臺下只能用WinClass,而在unix平臺下只能用UnixClass.它的主要作用不是配置而是定義通用接口扰才。
據(jù)個例子來說:我要畫園允懂,要實心園,我可以用SolidPen來配置衩匣,畫虛線園可以用dashedPen來配置蕾总。這是strategy模式。而同樣是畫園琅捏,我是在windows下來畫實心園生百,就用windowPen+solidPen來配置,在unix下畫實心園就用 unixPen+solidPen來配置柄延。如果要再windows下畫虛線園置侍,就用windowsPen+dashedPen來配置,要在unix下畫虛 線園拦焚,就用unixPen+dashedPen來配置。
我這里僅僅是就一種情況來說strategy和bridge的組合應(yīng)用杠输,其他的組合可能性隨環(huán)境變化而多種多樣赎败。從中可以看出,bridge和strategy是可能組合使用蠢甲,側(cè)重不同方面的僵刮。模式某種角度上來講就是對象組合。不要看他們都是對象組合就好像是一樣的鹦牛。模式的動機搞糕,意圖,使用場合曼追,組合方式窍仰,這些都是模式的一部分。其中細微的不同足以區(qū)分不同的模式礼殊。
橋接(Bridge)模式是結(jié)構(gòu)型模式的一種驹吮,而策略(strategy)模式則屬于行為模式针史。以下是它們的UML結(jié)構(gòu)圖。
在橋接模式中碟狞,Abstraction通過聚合的方式引用Implementor啄枕。
在策略模式中,Context也使用聚合的方式引用Startegy抽象接口族沃。
從他們的結(jié)構(gòu)圖可知频祝,在這兩種模式中,都存在一個對象使用聚合的方式引用另一個對象的抽象接口的情況脆淹,而且該抽象接口的實現(xiàn)可以有多種并且可以替換常空。可以說兩者在表象上都是調(diào)用者與被調(diào)用者之間的解耦未辆,以及抽象接口與實現(xiàn)的分離窟绷。
那么兩者的區(qū)別體現(xiàn)在什么地方呢?
1. 首先咐柜,在形式上兼蜈,兩者還是有一定區(qū)別的,對比兩幅結(jié)構(gòu)圖拙友,我們可以發(fā)現(xiàn)为狸,在橋接模式中不僅Implementor具有變化 (ConcreateImplementior),而且Abstraction也可以發(fā)生變化(RefinedAbstraction)遗契,而且兩者的變化 是完全獨立的辐棒,RefinedAbstraction與ConcreateImplementior之間松散耦合,它們僅僅通過Abstraction與 Implementor之間的關(guān)系聯(lián)系起來牍蜂。而在策略模式中漾根,并不考慮Context的變化,只有算法的可替代性鲫竞。
2. 其次在語意上辐怕,橋接模式強調(diào)Implementor接口僅提供基本操作,而Abstraction則基于這些基本操作定義更高層次的操作从绘。而策略模式強調(diào) Strategy抽象接口的提供的是一種算法寄疏,一般是無狀態(tài)、無數(shù)據(jù)的僵井,而Context則簡單調(diào)用這些算法完成其操作陕截。
- 橋接模式中不僅定義Implementor的接口而且定義Abstraction的接口,Abstraction的接口不僅僅是為了與 Implementor通信而存在的批什,這也反映了結(jié)構(gòu)型模式的特點:通過繼承农曲、聚合的方式組合類和對象以形成更大的結(jié)構(gòu)。在策略模式中驻债,Startegy 和Context的接口都是兩者之間的協(xié)作接口朋蔫,并不涉及到其它的功能接口罚渐,所以它是行為模式的一種。行為模式的主要特點就是處理的是對象之間的通信方 式驯妄,往往是通過引入中介者對象將通信雙方解耦荷并,在這里實際上就是將Context與實際的算法提供者解耦。
所以相對策略模式青扔,橋接模式要表達的內(nèi)容要更多源织,結(jié)構(gòu)也更加復(fù)雜。橋接模式表達的主要意義其實是接口隔離的原則微猖,即把本質(zhì)上并不內(nèi)聚的兩種體系區(qū)別 開來谈息,使得它們可以松散的組合,而策略在解耦上還僅僅是某一個算法的層次凛剥,沒有到體系這一層次侠仇。從結(jié)構(gòu)圖中可以看到,策略的結(jié)構(gòu)是包容在橋接結(jié)構(gòu)中的犁珠,橋 接中必然存在著策略模式逻炊,Abstraction與Implementor之間就可以認為是策略模式,但是橋接模式一般Implementor將提供一系 列的成體系的操作犁享,而且Implementor是具有狀態(tài)和數(shù)據(jù)的靜態(tài)結(jié)構(gòu)余素。而且橋接模式Abstraction也可以獨立變化。
轉(zhuǎn):https://blog.csdn.net/youthon/article/details/7653389