2013年11月22日 星期五

C# Design Pattern - Bridge

在軟體系統中,某些類型由於自身的邏輯,它具有兩個或多個維度的變化,開發者可以將抽象部分與實現部分分離,使它們都可以獨立的變化。

如同蠟筆一樣。紅紅綠綠的蠟筆一大盒,可以根據想像描繪出格式圖樣。但想要繪製一幅圖畫,藍天、白雲、綠樹、小鳥,如果畫面尺寸很大,那麼用蠟筆繪製就會遇到點麻煩。最好有粗粗的蠟筆很快能塗抹完成。如果一套12種顏色的蠟筆,我們需要兩套 24支,為了一幅畫,我們需要準備24支型號不同的蠟筆。
但是用毛筆就不同了,一套水彩12色,外加大小二支毛筆,畫藍天用大毛筆,畫小鳥用小毛筆,各具特色。

所以呢,Bridge模式,就是通過Bridge模式,我們把乘法運算2×1224改為了加法運算21214。然後如同蠟筆和毛筆的特色一般將抽象化 (Abstraction)與實現化(Implementation)脫耦,使得二者可以獨立地變化
蠟筆的顏色就是蠟筆的本身,但毛筆與顏料能夠脫耦而各別獨立,各自獨立變化,便簡化了操作。
蠟筆由於無法將筆與顏色分離,造成筆與顏色兩個自由度無法單獨變化,使得必須要有24種筆色才能完成任務。Bridge模式將繼承關係轉換為組合關係,從而降低了系統間的耦合,減少了程式碼編程。  

abstract class Brush
{
protected Color c;
public abstract void Paint();
public void SetColor(Color c)
{ this.c = c; }

}

建立二個類別,分別是大刷子和小刷子
class BigBrush : Brush
{
public override void Paint()
{
Console.WriteLine("Using big brush and color {0} painting", c.color);
}

}

class SmallBrush : Brush
{
public override void Paint()
{
Console.WriteLine("Using small brush and color {0} painting", c.color);
}

}

建立三種不同顏色類別
class Red : Color
{
public Red()
{ this.color = "red"; }

}

class Green : Color
{
public Green()
{ this.color = "green"; }

}

class Blue : Color
{
public Blue()
{ this.color = "blue"; }

}


不同大小的毛筆可以產生相同而不同的顏色,然後各別達到不同的功效
class Program
{
public static void Main()
{
Brush b = new BigBrush();
b.SetColor(new Red());
b.Paint();
b.SetColor(new Blue());
b.Paint();
b.SetColor(new Green());
b.Paint();

b = new SmallBrush();
b.SetColor(new Red());
b.Paint();
b.SetColor(new Blue());
b.Paint();
b.SetColor(new Green());
b.Paint();
}

}


Bridge模式使用物件間的組合關係,解耦了抽象和實現之間固有的綁定關係,使得抽象和實現可以沿著自身的維度來變化。Bridge模式較類似多繼承,但是多繼承往往違背了類別的單一職責原則,複用性比較差。Bridge模式是比多繼承更好的解決方法,所以應用一般在兩個非常強的變化維度。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言