若直接用繼承建模「品牌 x 功能」的矩陣:`ChangHongRemote`、`ChangHongAdvancedRemote`、`SamsungRemote`、`SamsungAdvancedRemote`... 每新增一品牌或一功能,類別數呈乘法增長。橋接模式將抽象化 (遙控器介面)與實現化 (電視機具體操作)分離,雙方透過組合關係協作,實現獨立演化。

// 實現化介面
public interface ITV
{
void On();
void Off();
void TuneChannel();
}
// 具體實現:長虹
public class ChangHongTV : ITV
{
public void On() => Console.WriteLine("長虹電視:開機歡迎畫面");
public void Off() => Console.WriteLine("長虹電視:關機待機");
public void TuneChannel() => Console.WriteLine("長虹電視:切換頻道中...");
}
// 具體實現:三星
public class SamsungTV : ITV
{
public void On() => Console.WriteLine("三星電視:Smart Hub 啟動");
public void Off() => Console.WriteLine("三星電視:進入省電模式");
public void TuneChannel() => Console.WriteLine("三星電視:數位頻道搜尋...");
}
// 抽象化基類:持有實現化參考
public abstract class RemoteControl
{
protected ITV _tv;
protected RemoteControl(ITV tv) => _tv = tv;
public virtual void On() => _tv.On();
public virtual void Off() => _tv.Off();
public virtual void SetChannel() => _tv.TuneChannel();
}
// 擴展抽象化:增加「音量控制」、「上一台」等高級功能
public class AdvancedRemote : RemoteControl
{
public AdvancedRemote(ITV tv) : base(tv) { }
public void VolumeUp() => Console.WriteLine("遙控器:音量 +");
public void VolumeDown() => Console.WriteLine("遙控器:音量 -");
public void PreviousChannel() => Console.WriteLine("遙控器:返回上一台");
// 可覆寫基礎行為增加日誌、驗證等
public override void SetChannel()
{
Console.WriteLine(">>> 記錄用戶換台行為");
base.SetChannel();
Console.WriteLine("<<< 換台完成");
}
}
static void Main()
{
// 組合 1:基礎遙控器 + 長虹
RemoteControl basic = new RemoteControl(new ChangHongTV());
basic.On();
basic.SetChannel();
basic.Off();
Console.WriteLine("----- 分割線 -----");
// 組合 2:高級遙控器 + 三星
AdvancedRemote advanced = new AdvancedRemote(new SamsungTV());
advanced.On();
advanced.VolumeUp();
advanced.PreviousChannel(); // 基礎遙控器沒有此功能
advanced.Off();
Console.ReadKey();
}
汽車類型 (`Bus`, `Limousine`) 與引擎類型 (`GasEngine`, `DieselEngine`) 正交變化。
// 抽象化:汽車
public abstract class Car
{
protected IEngine _engine;
protected Car(IEngine engine) => _engine = engine;
public abstract void Start();
public abstract void Stop();
}
// 擴展抽象化
public class Bus : Car
{
public Bus(IEngine engine) : base(engine) { }
public override void Start() { _engine.Start(); Console.WriteLine("公車啟動,準備載客"); }
public override void Stop() { _engine.Stop(); Console.WriteLine("公車熄火,結束班次"); }
}
public class Limousine : Car
{
public Limousine(IEngine engine) : base(engine) { }
public override void Start() { _engine.Start(); Console.WriteLine("豪華轎車靜默啟動"); }
public override void Stop() { _engine.Stop(); Console.WriteLine("豪華轎車平穩熄火"); }
}
// 實現化:引擎介面
public interface IEngine
{
void Start();
void Stop();
}
public class GasEngine : IEngine
{
public void Start() => Console.WriteLine("汽油引擎:點火啟動");
public void Stop() => Console.WriteLine("汽油引擎:切斷燃油");
}
public class DieselEngine : IEngine
{
public void Start() => Console.WriteLine("柴油引擎:壓縮點火啟動");
public void Stop() => Console.WriteLine("柴油引擎:切斷供油");
}
// 使用
var bus = new Bus(new DieselEngine());
bus.Start(); // 柴油引擎啟動 -> 公車啟動
var limo = new Limousine(new GasEngine());
limo.Start(); // 汽油引擎啟動 -> 豪華轎車啟動
| 角色 | 範例對應 | 職責 |
|---|---|---|
| Abstraction (抽象化) | RemoteControl, Car | 定義高層介面,持有 Implementor 參考 |
| RefinedAbstraction (修正抽象化) | AdvancedRemote, Bus | 擴展介面,增加新功能 |
| Implementor (實現化) | ITV, IEngine | 定義底層操作介面 |
| ConcreteImplementor (具體實現化) | ChangHongTV, GasEngine | 實作底層具體邏輯 |
橋接模式以「組合取代繼承」,將「做什麼」 (抽象化) 與「怎麼做」 (實現化) 解耦。它是處理多維度變化系統的基石模式,雖增加了設計複雜度 (需識別兩條變化軸),但換來的是系統級的靈活性與可維護性。識別出系統中**穩定的高層抽象**與**易變的底層實現**,是套用此模式的關鍵洞察力。