轉接器模式(Adapter)


將一個類別介面,轉換成另一個介面以供客戶使用。轉接器讓原本介面不相容的物件可以合作無間。 深入淺出設計模式


簡單範例

有一個池塘,裡面有許多鴨子,突然來了一隻火雞想融入鴨群裡,他透過了轉接器模式,把自己的樣子換成了鴨子騙過了鴨群。

static void Main(string[] args) { //真的火雞 ITurkey turkey = new WildTurkey(); //真的鴨子 IDuck duck = new MallardDuck(); //透過轉接器矇騙過關 IDuck fakeDuck = new TurkeyAdapter(turkey); turkey.Gobble(); turkey.Fly(); DuckMove(duck); DuckMove(fakeDuck); } static void DuckMove(IDuck duck){ duck.Quack(); duck.Fly(); }

鴨子介面

public interface IDuck { void Quack(); void Fly(); }

火雞介面

public interface ITurkey { void Fly(); void Gobble(); }

鴨子與火雞的實作

public class MallardDuck : IDuck { public void Quack(){ Console.WriteLine("MallardDuck quack !"); } public void Fly(){ Console.WriteLine("MallardDuck fly !"); } } public class WildTurkey : ITurkey { public void Fly(){ Console.WriteLine("WildTurkey fly !"); } public void Gobble(){ Console.WriteLine("WildTurkey gobble !"); } }

火雞轉接器(火雞轉換成鴨子)

public class TurkeyAdapter : IDuck { private ITurkey turkey; public TurkeyAdapter(ITurkey turkey){ this.turkey = turkey; } public void Quack(){ turkey.Gobble(); } public void Fly(){ turkey.Fly(); } }

轉接器的種類

  • 類別轉接器
    • 透過繼承取得被轉接者的行為
    • 利用多重繼承
    • 較有效率
  • 物件轉接器
    • 透過合成取得被轉接者的行為
    • 利用介面
    • 較有彈性

轉接器vs裝飾者

  • 裝飾者
    • 不改變介面,但加入責任
    • 擴充物件的行為或責任
    • 讓新的行為加入類別,無需改變類別程式碼
  • 轉接器
    • 將一個介面轉換另一個介面
    • 允許使用者使用新的程式庫和子集合,無需改變程式碼