--- title: 轉接器模式 tags: 設計模式 --- # 轉接器模式(Adapter) --- > 將一個類別介面,轉換成另一個介面以供客戶使用。轉接器讓原本介面不相容的物件可以合作無間。 > [name=深入淺出設計模式] --- ## 簡單範例 有一個池塘,裡面有許多鴨子,突然來了一隻火雞想融入鴨群裡,他透過了轉接器模式,把自己的樣子換成了鴨子騙過了鴨群。 ```csharp= 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(); } ``` --- 鴨子介面 ```csharp= public interface IDuck { void Quack(); void Fly(); } ``` 火雞介面 ```csharp= public interface ITurkey { void Fly(); void Gobble(); } ``` --- 鴨子與火雞的實作 ```csharp= 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 !"); } } ``` --- 火雞轉接器(火雞轉換成鴨子) ```csharp= 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裝飾者 * 裝飾者 * 不改變介面,但加入責任 * 擴充物件的行為或責任 * 讓新的行為加入類別,無需改變類別程式碼 * 轉接器 * 將一個介面轉換另一個介面 * 允許使用者使用新的程式庫和子集合,無需改變程式碼 ---