橋接模式
我們在用畫筆畫畫的時候可以發現,畫筆的種類有很多種,粗筆刷,細筆刷,以及硬筆刷,軟筆刷等等,顔色也有很多種,紅的,藍色,綠的,紫的等等,那他們的組合就是 m*n,像這樣多個次元都可以變化的例子還有很多,不同大小,顔色,字型的文字等等。若把每一種情況都單獨寫出來的話,工作量異常龐大,是以對于這種情況,用橋接模式就可以很好的實作。
意圖:将抽象部分與實作部分分離,使它們都可以獨立的變化。
在類圖中我們可以看到,把
Color
和
PaintBrush
都改成抽象類,其他的相關的子類,繼承自抽象類,而如果想要用細筆刷畫畫,則直接執行個體化一個具體的顔色,在執行個體化一個細筆刷,把顔色傳遞到細筆刷即可。
橋接(Bridge)模式的優點是:
- 抽象與實作分離,擴充能力強
- 符合開閉原則
- 符合合成複用原則
- 其實作細節對客戶透明
缺點是:
- 由于聚合關系建立在抽象層,要求開發者針對抽象化進行設計與程式設計,能正确地識别出系統中兩個獨立變化的次元,這增加了系統的了解與設計難度。
完整代碼如下。
using System;
namespace _07_Bridge
{
/// <summary>
/// 橋接模式
/// </summary>
class Program
{
static void Main(string[] args)
{
Color c = new Red();
PaintBrush thinBrush = new ThinBrush(c); //顔色通過構造函數傳入
thinBrush.Draw();
Console.WriteLine();
}
}
//抽象類,塗顔色
abstract class Color
{
public abstract void Colour();
}
//紅色類,塗顔色的實作
class Red : Color
{
public override void Colour()
{
Console.WriteLine("Red color....");
}
}
//抽象類,畫畫
abstract class PaintBrush
{
protected Color color;
public PaintBrush(Color c)
{
color = c;
}
public abstract void Draw();
}
//中等筆刷畫畫的實作
class MediumBrush:PaintBrush
{
public MediumBrush(Color c):base(c)
{
}
public override void Draw()
{
Console.WriteLine("Medium line");
color.Colour();
}
}
//細筆刷畫畫的實作
class ThinBrush : PaintBrush
{
public ThinBrush(Color c) : base(c)
{
}
public override void Draw()
{
Console.WriteLine("Thin line");
color.Colour();
}
}
}