橋接模式是一種在日常開發中不是特別常用的設計模式,主要是因為上手難度較大,但是對於理解面向對象設計有非常大的幫助。 ...
簡介
橋接設計模式(Bridge Design Pattern)也叫作橋梁模式,其描述是將實現和抽象放在兩個不同的類層次中,使兩個層次可以獨立地變化。
橋接模式採用抽象關聯取代了傳統的多層繼承,將類之間的靜態繼承關係轉化為動態的對象組合關係,使系統更加靈活,並易於擴展,同時有效控制了系統中類的個數。
在橋接模式中,有以下概念需要理解:
- 抽象化:將對象共同的性質抽取出去而形成類的過程
- 實現化:和抽象化是一個互逆的過程,實現化是對抽象化事物的進一步具體化
- 脫耦:將抽象化和實現化之間強關聯改換成弱關聯,將兩個角色之間的繼承關係改為關聯關係
橋接模式主要解決的是多維度的指數級變化。
具體實現
以手機為例,手機既可以按照品牌分類,也可以按照手機軟體來分類,兩種維度交叉的變化遠必一種維度多得多。
手機軟體代碼示例如下:
// 抽象類
public abstract class HandsetSoft {
public abstract void run();
}
// 實現類
public class HandsetGame extends HandsetSoft {
@Override
public void run() {
System.out.println("運行手機游戲");
}
}
public class HandsetAddressList extends HandsetSoft {
@Override
public void run() {
System.out.println("運行手機通訊錄");
}
}
手機品牌代碼示例如下:
// 抽象類
public abstract class HandsetBrand {
protected HandsetSoft soft;
// 設置手機軟體
public void setHandsetSoft(HandsetSoft soft) {
this.soft = soft;
}
// 運行
public abstract void run();
}
// 實現類
public class HandsetBrandA extends HandsetBrand {
@Override
public void run() {
soft.run();
}
}
public class HandsetBrandB extends HandsetBrand {
@Override
public void run() {
soft.run();
}
}
客戶端代碼示例如下:
public class Client {
public static void main(String[] args) {
HandsetBrand ab;
// A 品牌
ab = new HandsetBrandA();
ab.setHandsetSoft(new HandsetGame());
ab.run();
ab.setHandsetSoft(new HandsetAddressList());
ab.run();
// B 品牌
ab = new HandsetBrandB();
ab.setHandsetSoft(new HandsetGame());
ab.run();
ab.setHandsetSoft(new HandsetAddressList());
ab.run();
}
}
總結
優點
橋接模式的主要優點如下:
- 實現了抽象和實現部分的分離,從而極大地提高了系統的靈活性
- 使用橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本
- 橋接模式提高了系統的可擴展性,在兩個維度中任意擴展一個維度,都不需要修改原有系統,符合開閉原則
缺點
橋接模式的主要缺點如下:
- 增加了系統的理解和設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計和編程
- 橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用範圍有一定的局限性
適用場景
橋接模式的適用場景如下:
- 對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用
- 一個類存在兩個或多個獨立變化的維度,且這兩個或多個維度都需要獨立進行擴展
源碼
橋接模式是設計 Java 虛擬機和實現 JDBC 等驅動程式的核心模式之一,應用較為廣泛。