<大話設計模式>本教程說明及著作權聲明
國士工作室是一支專註於Android平台企業級應用開發的技術團隊,致力於做中國最棒的Android應用程式開發機構,提供最棒的Android企業級應用開發培訓服務。
企業培訓和開發合作官方連絡方式:
電話:18610086859
Email:hiheartfirst@gmail.com
QQ:1740415547
QQ群:148325348
國士工作室 有你更美好!
l 該文檔參考和使用了網路上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互連網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。
l 如果對該文檔有任何疑問或者建議,請進入官方部落格
http://www.cnblogs.com/guoshiandroid/留言或者直接與國士工作室聯絡(後附連絡方式),我們會謹慎參考您的建議並根據需要對本文檔進行修改,以造福更多開發人員!
l 《大話設計模式》的最新及完整內容會在國士工作室官方部落格定期更新,請訪問國士工作室部落格
http://www.cnblogs.com/guoshiandroid/擷取更多更新內容。
橋接模式 最重要的是有一顆讓MM快樂的心
橋接模式應用情境舉例:
早上碰到MM,要說早上好;晚上碰到MM,要說晚上好;碰到MM穿了件新衣服,要說你的衣服好漂亮哦;碰到MM新做的髮型,要說你的頭髮好漂亮哦。不要問我“早上碰到MM新做了個髮型怎麼說”這種問題,自己用BRIDGE組合一下不就行了,關鍵是要有一顆讓MM快樂的心,只要你擁有一顆這樣的心,你就不再是…
橋接模式解釋:
橋接模式(Bridge Pattern)是構造型的設計模式之一。Bridge模式基於類的最小設計原則,通過使用封裝,彙總以及繼承等行為來讓不同的類承擔不同的責任。它的主要特點是把抽象(abstraction)與行為實現(implementation)分離開來,從而可以保持各部分的獨立性以及應對它們的功能擴充。
英文定義為:Decouple an abstraction from its implementation so that the two can
vary independently.
橋接模式的UML圖:
代理模式所涉及的角色如下:
抽象化(Abstraction)角色:抽象類別介面(介面或者抽象類別),並儲存一個對實現化對象的引用。
修正抽象化(Refined
Abstraction)角色:擴充抽象化角色,改變和修正父類對抽象化的定義。
實現化(Implementor)角色:這個角色給出實現化角色的介面,但不給出具體的實現。必須指出的是,這個介面不一定和抽象化角色的介面定義相同,實際上,這兩個介面可以非常不一樣。實現化角色應當只給出底層操作,而抽象化角色應當只給出基於底層操作的更高一層的操作。
具體實現化(Concrete Implementor)角色:這個角色給出實現化角色介面的具體實現。
代理模式的UML圖如下 所示:
橋接模式深入分析:
一位哲學家說“你永遠也看不到一條一模一樣的河”,不考慮哲學上的對錯,光是從變化的角度看,的確是這樣,因為儘管一條小河,在空間上沒有發生變化,但在時間座標上已經發生了改變,世上萬物都在做著這樣的變化,但是你把一塊石頭放在你的魚缸裡面,幾天后,你會發現它還是那塊石頭,這說明事物儘管都有向多個維度變化的特性,但是有些事物是相對比較穩定的,而有些事物多維度變化確實比較激勵的。我們用繼承(inherit)解決了變化不穩定的事物的擴充問題,如何利用物件導向的技術來使得事物能夠輕鬆的沿著多個方向進行變化,實現起來又不是很複雜呢?這就要使用Bridge模式。
Bridge橋接模式是一種結構型模式,它主要應對的是:由於類型的固有羅輯,使得類型具有兩個或兩個以上的緯度變化。也就是要求抽象不應依賴於實現細節,實現細節應依賴於抽象。
使用橋接模式使得抽象和行為實現分離出來,從而使得他們可以獨立自由的修改和擴充。
在物件導向設計的基本概念中,對象這個概念實際是由屬性和行為兩個部分組成的,我們可以認為屬性一種靜止的,是一種抽象,一般情況下,行為是包含在一個對象中,但是,在有的情況下,我們需要將這些行為也進行歸類,形成一個總的行為介面,這就是橋模式的用處。
我們可以認為橋模式是把一個對象的屬性和行為分類開來,然後我們針對屬性和行為分別抽象化和具體化,同時保持屬性部分對行為的引用。
橋接模式使用情境分析及代碼實現:
在上面的使用情境中,MM可以看成修正抽象化(Refined Abstraction)角色執行個體化對象,而各種甜言蜜語是具體實現化(Concrete
Implementor)角色執行個體化,如所示:
建立抽象化(Abstraction)角色
package com.diermeng.designPattern.Bridge; /* * 抽象化(Abstraction)角色 */ public abstract class Girl { /* * 對具體實現化角色的引用 */ private SweetWord sweetWord; public Girl(SweetWord sweetWord) { this.sweetWord = sweetWord; } public SweetWord getSweetWord() { return sweetWord; } public void setSweetWord(SweetWord sweetWord) { this.sweetWord = sweetWord; } public abstract void sayHi(); } |
建立實現化角色:
package com.diermeng.designPattern.Bridge; /* * 實現化角色 */ public interface SweetWord { public void praise(); } |
建立修正抽象化(Refined
Abstraction)角色:
package com.diermeng.designPattern.Bridge.impl; import com.diermeng.designPattern.Bridge.Girl; import com.diermeng.designPattern.Bridge.SweetWord; /* * 修正抽象化(Refined Abstraction)角色 */ public class MM extends Girl{ public MM(SweetWord sweetWord) { super(sweetWord); } public void sayHi() { this.getSweetWord().praise(); } } |
具體實現化角色一:
package com.diermeng.designPattern.Bridge.impl; import com.diermeng.designPattern.Bridge.SweetWord; /* * 具體實現化角色 */ public class SweetWordOne implements SweetWord { public void praise() { System.out.println("MM,早上好^_^"); } } |
具體實現化角色二:
package com.diermeng.designPattern.Bridge.impl; import com.diermeng.designPattern.Bridge.SweetWord; /* * 具體實現化角色 */ public class SweetWordTwo implements SweetWord{ public void praise() { System.out.println("MM晚上好^_^"); } } |
具體實現化角色三:
package com.diermeng.designPattern.Bridge.impl; import com.diermeng.designPattern.Bridge.SweetWord; /* * 具體實現化角色 */ public class SweetWordThree implements SweetWord{ public void praise() { System.out.println("你的新髮型好想漂亮:-O"); } } |
具體實現化角色四:
package com.diermeng.designPattern.Bridge.impl; import com.diermeng.designPattern.Bridge.SweetWord; /* * 具體實現化角色 */ public class SweetWordFour implements SweetWord{ public void praise() { System.out.println("你的衣服好漂亮:-O"); } } |
建立一個測試用戶端:
package com.diermeng.designPattern.Bridge.client; import com.diermeng.designPattern.Bridge.Girl; import com.diermeng.designPattern.Bridge.SweetWord; import com.diermeng.designPattern.Bridge.impl.MM; import com.diermeng.designPattern.Bridge.impl.SweetWordFour; import com.diermeng.designPattern.Bridge.impl.SweetWordOne; import com.diermeng.designPattern.Bridge.impl.SweetWordThree; import com.diermeng.designPattern.Bridge.impl.SweetWordTwo; /* * 測試用戶端 */ public class BridgeTest { public static void main(String[] args) { SweetWord sweetWordOne = new SweetWordOne(); SweetWord sweetWordTwo = new SweetWordTwo(); SweetWord sweetWordThree = new SweetWordThree(); SweetWord sweetWordFour = new SweetWordFour(); Girl girl1 = new MM(sweetWordOne); girl1.sayHi(); Girl girl2 = new MM(sweetWordTwo); girl2.sayHi(); Girl girl3 = new MM(sweetWordThree); girl3.sayHi(); Girl girl4 = new MM(sweetWordFour); girl4.sayHi(); } } |
運行結果如下:
MM,早上好^_^ MM晚上好^_^ 你的新髮型好想漂亮:-O 你的衣服好漂亮:-O |
橋接模式的優缺點分析:
優點:
使用橋模式,能夠提供比使用繼承關係更靈活的功能。它可以使用抽象和實現分離開,降低了耦合關係。當有新的抽象或實現方式時,只需要繼承一個抽象和繼承一個實現即可。
缺點:
如果要重新抽象出另外一個類型,則需要修改抽象。
橋接模式的實際應用簡介:
橋接模式一般應用於以下場合:
如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態聯絡。
設計要求實現化角色的任何改變不應當影響用戶端,或者說實現化角色的改變對用戶端是完全透明的。
一個構件有多於一個的抽象化角色和實現化角色,系統需要它們之間進行動態耦合。 雖然在系統中使用繼承是沒有問題的,但是由於抽象化角色和具體化角色需要獨立變化,設計要求需要獨立管理這兩者。
溫馨提示:
橋接模式是一種相對比較複雜的結構型模式,橋接模式把抽象和實現分離開,降低了耦合關係,有利於提高類的可維護性和可複用性。橋接模式把不同的變化緯度分別進行抽象和實現,有利於模組化。