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{ /** * 目的地 */ @Overridepublic 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設計模式概述。
Java設計模式學習記錄-橋接模式