2013年7月18日 星期四

設計模式:橋接模式 (Bridge Pattern)

橋接模式 (Bridge Pattern),以下程式碼以 C# 為例

說明:
將一個物件的具體行為(實作)抽出來,成為一個獨立的物件。
也就是原本的一個物件,變成兩個物件:「抽像物件」+「實作物件」。
優點是抽像物件與實作物件可以解耦合,各自獨立變化。

範例:
一個圓形的類別,可以指定使用不同的畫圖物件,來畫出圓形。

希望達成如下的效果
static void Main(string[] args)
{
    // 新增兩個圓形物件,分別指定不同畫圖物件
    Circle a = new Circle(new DrawCircle_A());
    Circle b = new Circle(new DrawCircle_B());

    // 分別畫出圓形
    a.Draw();
    b.Draw();

    Console.Read();
}
執行結果: 
第 1 種畫圓形方法
第 2 種畫圓形方法

實現重點在於,畫圖的實作物件,是分離出來,再另外指定的。

其餘程式碼
// "形狀"的抽象類別
abstract class Shape
{
    protected DrawImplementor drawImplementor;

    protected Shape(DrawImplementor drawImplementor)
    {
        this.drawImplementor = drawImplementor;
    }

    public abstract void Draw();
}

// "圓形"類別 (抽象物件)
class Circle : Shape
{
    public Circle(DrawImplementor drawImplementor)
        : base(drawImplementor)
    {
    }

    public override void Draw()
    {
        drawImplementor.DrawCircle(); // 讓實作物件畫圖形
    }
}

// 畫圖形的實作介面
interface DrawImplementor
{
    void DrawCircle();
}

// 第1種畫圓形的類別 (實作物件))
class DrawCircle_A : DrawImplementor
{
    public void DrawCircle()
    {
        Console.WriteLine("第 1 種畫圓形方法");
    }
}

// 第2種畫圓形的類別 (實作物件))
class DrawCircle_B : DrawImplementor
{
    public void DrawCircle()
    {
        Console.WriteLine("第 2 種畫圓形方法");
    }
}

相關連結:設計模式整理列表

沒有留言:

張貼留言