何時使用適配器模式
- 系統需使用現有類但介面不符。
- 建立可重用類與多個無關類 (含未來新增) 協作。
- Object Adapter 適用:需適配多個現有子類,若用 Class Adapter 需為每個子類寫適配器,不切實際。
實戰範例:汽車 vs 飛機介面適配
using System;
// Target: 客戶期望介面
public interface ICar { void Drive(); }
// 直接實作
public class CToyota : ICar
{
public void Drive() => Console.WriteLine("Vroom Vroom, Toyota!");
}
// Adaptee: 被適配者
public class CCessna
{
public void Fly() => Console.WriteLine("Static runup OK, C172!");
}
// Class Adapter: 多重繼承 (C# 用介面實現)
public class CDrivableCessna : CCessna, ICar
{
public void Drive() => base.Fly(); // Drive 內部呼叫 Fly
}
// Object Adapter: 組合/委派
public class CDrivableCessna2 : ICar
{
private CCessna contained = new CCessna();
public void Drive() => contained.Fly();
}
// Client
public class Client
{
static void Main()
{
ICar car = new CToyota();
Console.Write("Class Adapter: "); car.Drive();
car = new CDrivableCessna();
Console.Write("Driving Cessna: "); car.Drive();
car = new CDrivableCessna2();
Console.Write("Object Adapter: "); car.Drive();
}
}
對比
| 類型 | 實現方式 | 優點 | 缺點 |
| Class Adapter | 繼承 Adaptee + 實作 Target | 可覆寫 Adaptee 行為 | C# 單繼承限制,一對一適配 |
| Object Adapter | 組合 Adaptee 實例 + 實作 Target | 一個適配器適配多個 Adaptee 子類 | 難以覆寫 Adaptee 方法 |