Bridge Pattern 是一種結構型設計模式,可以用來將抽象和實現部分分離,讓它們可以獨立地變化。

Bridge Pattern的四個要素:

  1. 模式名稱

Bridge Pattern,是一種結構型設計模式。

  1. 問題

當系統需要支援多種平台或者多種應用程式時,程式碼會變得複雜且難以維護。如果要添加新的平台或者應用程式,就需要修改大量的程式碼。同時,這也會造成類之間的緊密耦合,使得程式碼難以測試、重用和擴展。

  1. 解決方案

Bridge Pattern 的解決方案是將系統中的抽象部分和實現部分分離,讓它們可以獨立地變化。這樣就可以讓系統更容易擴展和修改,同時也能夠降低類之間的耦合程度。

  1. 結果

Bridge Pattern 的結果是將系統中的抽象和實現部分分離,降低了它們之間的耦合度,使系統更容易擴展和修改。同時,Bridge Pattern 也提高了程式碼的可讀性和可維護性,讓程式碼更易於測試和重用。

成員與功用

成員 功用
Abstraction(抽象部分) 定義抽象部分,並維護一個指向 Implementor(實現部分)對象的引用。它的主要職責是定義出高層次的抽象概念,並依賴 Implementor 來實現。
RefinedAbstraction(具體抽象部分) 擴展 Abstraction 的介面,以提供更具體的操作方法。通常會保存一個對 ConcreteImplementor(具體實現部分)的引用。
Implementor(實現部分) 定義實現部分的介面,為 Abstraction 提供基本操作,並且可以被 ConcreteImplementor 繼承或實現。
ConcreteImplementor(具體實現部分) 實現 Implementor 介面,提供具體的操作方法。

以下是 Bridge Pattern 的 C# 實現方式:

C#範例

基本範例

  1. 定義 Abstraction 抽象類別或介面,定義系統的高層結構和抽象介面:
public abstract class Abstraction
{
    protected Implementor implementor;

    public Abstraction(Implementor implementor)
    {
        this.implementor = implementor;
    }

    public abstract void Operation();
}
  1. 定義 Implementor 抽象類別或介面,提供 Abstraction 所定義的介面的具體實現:
public abstract class Implementor
{
    public abstract void OperationImp();
}
  1. 定義 RefinedAbstraction 類別,擴展 Abstraction 類別,實現更細化的抽象介面:
public class RefinedAbstraction : Abstraction
{
    public RefinedAbstraction(Implementor implementor) :base(implementor)
    {
    }

    public override void Operation()
    {
        // 處理具體的業務邏輯
        implementor.OperationImp();
        // 處理具體的業務邏輯
    }
}
  1. 定義 ConcreteImplementorA 和 ConcreteImplementorB 類別,擴展 Implementor 類別,提供 Abstraction 所定義的介面的具體實現:
public class ConcreteImplementorA : Implementor
{
    public override void OperationImp()
    {
        // 處理具體的實現邏輯
    }
}

public class ConcreteImplementorB : Implementor
{
    public override void OperationImp()
    {
        // 處理具體的實現邏輯
    }
}

5. 實例化 Abstraction  Implementor 的對象,並將它們結合起來:
```csharp
Implementor implementorA = new ConcreteImplementorA();
Implementor implementorB = new ConcreteImplementorB();

Abstraction abstractionA = new RefinedAbstraction(implementorA);
Abstraction abstractionB = new RefinedAbstraction(implementorB);

abstractionA.Operation();
abstractionB.Operation();

實際產品(Product)為抽象部分,以「顏色」(Color)為實現部分的 Bridge Pattern 範例:

  1. 定義 Color 介面,提供操作顏色的方法:
public interface Color
{
    void ApplyColor();
}
  1. 定義具體的 Color 類別,實現 Color 介面:
public class WhiteColor : Color
{
    public void ApplyColor()
    {
        Console.WriteLine("白色");
    }
}

public class BlackColor : Color
{
    public void ApplyColor()
    {
        Console.WriteLine("黑色");
    }
}
  1. 定義 Product 抽象類別,提供操作產品的方法,並包含一個 Color 對象:
public abstract class Product
{
    protected Color color;

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

    public abstract void Produce();
}
  1. 定義具體的 Product 類別,擴展 Product 類別,提供產品的具體實現:
public class Shirt : Product
{
    public Shirt(Color color) : base(color)
    {
    }

    public override void Produce()
    {
        Console.Write("上衣,");
        color.ApplyColor();
    }
}

public class Pants : Product
{
    public Pants(Color color) : base(color)
    {
    }

    public override void Produce()
    {
        Console.Write("褲子,");
        color.ApplyColor();
    }
}
  1. 實例化 Product 和 Color 的對象,並將它們結合起來:
Color whiteColor = new WhiteColor();
Color blackColor = new BlackColor();

Product whiteShirt = new Shirt(whiteColor);
Product blackPants = new Pants(blackColor);

whiteShirt.Produce();  // 輸出:上衣,白色
blackPants.Produce();  // 輸出:褲子,黑色

以上是一個簡單的以「產品」為抽象部分,以「顏色」為實現部分的 Bridge Pattern 範例,你可以根據實際需求進行修改。

結論

Bridge Pattern 的主要優點是可以分離抽象部分和實現部分,使得它們可以獨立地變化。這樣可以提高系統的靈活性,並且有助於簡化系統的設計和實現。

Bridge Pattern 的主要缺點是需要額外定義一個 Implementor 類別,增加了系統的複雜度。另外,如果 Abstraction 和 Implementor 的數量過多,可能會導致類別層次結構過於複雜。

在實際應用中,Bridge Pattern 可以用於分離抽象類和實現類,尤其是在需要在運行時切換不同的實現時。例如,一個圖形繪製程式可以使用 Bridge Pattern 將圖形的形狀和顏色分離,這樣就可以方便地添加新的圖形形狀或者顏色。

如果系統需要支持多種不同的平台或者介面,也可以使用 Bridge Pattern 將平台或介面的實現和抽象分離,這樣就可以方便地添加新的平台或者介面。

總之,Bridge Pattern 是一個非常有用的設計模式,它可以提高系統的靈活性和可擴展性,有助於簡化系統的設計和實現。