Java設計模式學習記錄-橋接模式
前言
這次介紹結構型設計模式中的第二種模式,橋接模式。 使用橋接模式的目的就是為了解耦,松散的耦合更利于擴展,但是會增加相應的代碼量和設計難度。
橋接模式
橋接模式是為了將抽象化與實現化解耦,讓二者可以獨立地變化。方便對每一部分的擴展,以及單獨的維護。抽象化的一方與實現化的一方之間建立一個橋梁,這樣兩者的依賴關系就可以通過這個橋梁來建立了。
舉例
三個小動物要過河,分別是小豬,小雞,小馬,小豬要去河對面的空地曬太陽,小雞要去河對面的小樹林里找蟲子吃,小馬要去河對面的草地里吃草。那么它們三個都要經過小橋才能過河。有了場景下面來說一下代碼的實現,先創建一個小橋的接口。
/** * 小橋 */ public interface Bridge { /** * 目的地 */ void targetLand(); }
因為三個小動物的目的地不一樣,所以每一個目的地對應一個實現。
小豬的目的地
/** * 空地 */ public class VacantLand implements Bridge{ /** * 目的地 */ @Override public void targetLand() { System.out.println("空曠的地方,曬太陽"); } }
小雞的目的地
/** * 小樹林 */ public class Forest implements Bridge{ /** * 目的地 */ @Override public void targetLand() { System.out.println("小樹林,覓食。"); } }
小馬的目的地
/** * 草地 */ public class Grassland implements Bridge{ /** * 目的地 */ @Override public void targetLand() { System.out.println("大草原,盡情奔騰。"); } }
下面來實現抽象化的部分,每個小動物都要過橋去往不同的目的地,所以它們都要相同的過橋行為。所以定義一個動物抽象類。
/** * 小動物 */ public abstract class Animal { /** * 橋 */ Bridge bridge; /** * 過橋 */ abstract void willToDo(); }
小豬
/** * 小豬 */ public class Piglet extends Animal { /** * 過橋 */ @Override public void willToDo() { System.out.println("我是小豬要過橋去 "); } }
小雞
/** * 小雞 */ public class Chick extends Animal { /** * 過河橋 */ @Override public void willToDo() { System.out.println("我是小雞要過橋去 "); } }
小馬
/** * 小馬 */ public class Pony extends Animal { /** * 過橋 */ @Override public void willToDo() { System.out.println("我是小馬要過橋去 "); } }
測試例子
public class TestBridge { public static void main(String[] args) { Animal animal = new Chick(); animal.bridge = new Forest(); animal.willToDo(); animal.bridge.targetLand(); } }
運行結果
我是小雞要過橋去
小樹林,覓食。
這就是一個完整的橋接模式的例子,這樣使得小動物和要去的目的地解耦了。如果再來了一個小動物,例如小鴨子,它只需要繼承Animal類即可,如果它的目的地已經存在了就直接使用現有的目的地類,如果要去的目的地不存在(例如小鴨子要去池塘),那么可以再創建一個池塘的目的地,然后實現自Bridge就可以了。
結構
下面來介紹一下橋接模式的結構,如下圖所示。

從上面的結構圖中我們可以看出來,橋接模式其實是分為四個角色的。
抽象化角色(Animal類):定義抽象化,并保存一個對實現化對象的引用。
抽象化擴展角色(Chick、Piglet、Pony等具體的小動物類):實現和擴展抽象化角色的功能。
實現化角色(Bridge接口):此角色給出了實現化角色的接口,定義了實現化角色的行為。
具體實現化角色(VacantLand、GrassLand、Forest等目的地類):實現化角色接口的具體實現類。
橋接模式的優缺點
優點
1、分離抽象和實現部分:
分離了抽象和實現部分,提高了系統的靈活性,這樣有助于對系統進行分層,從而產生更好的結構化的系統。
2、更好的擴展性:
因為抽象部分和實現部分分離開了,所以這兩部分可以獨立擴展,互不影響,大大提高了系統的可擴展性。
3、可動態切換:
由于分離了抽象和實現,那么在實現橋接的時候,可以實現動態的選擇和使用具體的實現,也就是在運行期間動態切換實現。
4、減少了子類的數量:
從抽象和實現兩個維度來看,如果不是用橋接模式的話,這兩個維度的子類,在發生變化時影響到的數量是兩個維度子類的乘積。而使用了橋接模式后影響到的數量是兩個維度的子類的和。
缺點
增加了系統的理解和設計難度,入手并不是那么容易了,因為聚合關系定義在抽象層,所以需要開發者對抽象進行設計和編程。
想了解更多的設計模式請查看Java設計模式學習記錄-GoF設計模式概述。
作者:紀莫
歡迎任何形式的轉載,但請務必注明出處。
限于本人水平,如果文章和代碼有表述不當之處,還請不吝賜教。
歡迎掃描二維碼關注公眾號:Jimoer
文章會同步到公眾號上面,大家一起成長,共同提升技術能力。
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下。
您的鼓勵是博主的最大動力!


浙公網安備 33010602011771號