業務物件透過橋接模式與數據物件解耦,數據實現可動態更換**無需修改客戶端代碼**。
using System;
using System.Collections;
// 抽象化角色
class BusinessObject
{
private DataObject dataObject;
protected string group;
public BusinessObject(string group) => this.group = group;
public DataObject DataObject
{
set => dataObject = value;
get => dataObject;
}
public virtual void Next() => dataObject.NextRecord();
public virtual void Prior() => dataObject.PriorRecord();
public virtual void New(string name) => dataObject.NewRecord(name);
public virtual void Delete(string name) => dataObject.DeleteRecord(name);
public virtual void Show() => dataObject.ShowRecord();
public virtual void ShowAll()
{
Console.WriteLine($"Customer Group: {group}");
dataObject.ShowAllRecords();
}
}
// 修正抽象化
class CustomersBusinessObject : BusinessObject
{
public CustomersBusinessObject(string group) : base(group) { }
public override void ShowAll()
{
Console.WriteLine();
Console.WriteLine("------------------------");
base.ShowAll();
Console.WriteLine("------------------------");
}
}
// 實現化介面
abstract class DataObject
{
public abstract void NextRecord();
public abstract void PriorRecord();
public abstract void NewRecord(string name);
public abstract void DeleteRecord(string name);
public abstract void ShowRecord();
public abstract void ShowAllRecords();
}
// 具體實現化:記憶體清單
class CustomersDataObject : DataObject
{
private ArrayList customers = new ArrayList();
private int current = 0;
public CustomersDataObject()
{
customers.Add("Jim Jones");
customers.Add("Samual Jackson");
customers.Add("Allen Good");
customers.Add("Ann Stills");
customers.Add("Lisa Giolani");
}
public override void NextRecord() => current = Math.Min(current + 1, customers.Count - 1);
public override void PriorRecord() => current = Math.Max(current - 1, 0);
public override void NewRecord(string name) => customers.Add(name);
public override void DeleteRecord(string name) => customers.Remove(name);
public override void ShowRecord() => Console.WriteLine(customers[current]);
public override void ShowAllRecords()
=> customers.ForEach(c => Console.WriteLine(" " + c));
}
// 客戶端測試
public class BusinessApp
{
public static void Main()
{
CustomersBusinessObject customers = new CustomersBusinessObject("Chicago");
customers.DataObject = new CustomersDataObject(); // 動態注入實現
customers.Show();
customers.Next(); customers.Show();
customers.Next(); customers.Show();
customers.New("Henry Velasquez");
customers.ShowAll();
}
}
Customer Group: Chicago Jim Jones Samual Jackson Allen Good Ann Stills Lisa Giolani ------------------------ Customer Group: Chicago Jim Jones Samual Jackson Allen Good Ann Stills Lisa Giolani Henry Velasquez ------------------------
| 場景 | 橋接模式價值 |
|---|---|
| 抽象化與實現化需獨立變化 | 避免靜態繼承綁定,改用動態組合 |
| 實現化變更不應影響客戶端 | 實現完全透明,客戶端零修改 |
| 多抽象化 × 多實現化需動態搭配 | 運行時任意組合,避免笛卡兒積類別爆炸 |
| 需獨立管理兩個維度 | 繼承無法獨立演進,組合可獨立擴展 |
橋接模式將「繼承關係」轉為「組合關係」,是**合成復用原則 (CARP)** 的經典應用。理解橋接 = 理解 OCP + CARP = 形成正確設計思想的關鍵里程碑。