橋接模式

📢 本文由 gemini-2.5-flash 翻譯

Bridge Pattern 物件結構型模式

目的

將抽象部分與其實作部分分離,讓它們可以獨立地變化

結構

橋接模式

其中:

  • Abstraction 定義抽象類別的介面,維護一個指向 Implementor 類型物件的指標
  • RefinedAbstraction 擴充由 Abstraction 定義的介面
  • Implementor 定義實作類別的介面,該介面不一定要與 Abstraction 的介面完全一致;事實上這兩個介面可以完全不同 一般來說,Implementor 介面僅提供基本操作,而 Abstraction 定義了基於這些基本操作的較高層次的操作
  • ConcreteImplementor 實作 Implementor 介面並定義它的具體實作

適用性

Bridge 模式適用於:

  • 不希望在抽象和它的實作部分之間有一個固定的綁定關係。例如,這種情況可能是因為,在程式執行時實作部分應該可以被選擇或切換
  • 類別的抽象以及它的實作都應該可以透過生成子類別的方法加以擴充。這是 Bridge 模式使得開發者可以對不同的抽象介面和實作部分進行組合,並分別對它們進行擴充
  • 對一個抽象的實作部分的修改應該對客戶不產生影響,亦即客戶程式碼不必重新編譯
  • (C++) 想對客戶完全隱藏抽象的實作部分
  • 有許多類別要生成的類別階層結構
  • 想在多個物件間共享實作 (可能使用參考計數) ,但同時要求客戶並不知道這一點

範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class main {
    public static void main(String[] args) {
        Product ProductA1 = new ProductA();
        Product ProductA2 = new ProductA();

        Color red = new Red();
        ProductA1.setName("P-A1");
        ProductA1.setColor(red);
        ProductA1.Operation;

        Color blue = new Blue();
        ProductA1.setName("P-A2");
        ProductA1.setColor(blue);
        ProductA1.Operation;
    }
}

abstract class Product{
    private String name;
    protected Color color;

    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        this.name = name;
    }

    public setColor(Color color){
        this.color = color;
    }

    public abstract void Operation();
} 

class ProductA extends Product{
    @Override
    public void Operation(){
        color.OperationImp(this.getName());
    }
}

class Color{
    public void OperationImp(String name);
}

class Red extends Color{
    @Override
    public void OperationImp(String name){
        System.out.println(name + ": red")
    }
}

class Blue extends Color{
    @Override
    public void OperationImp(String name){
        System.out.println(name + ": blue")
    }
}