--- 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裝飾者 * 裝飾者 * 不改變介面,但加入責任 * 擴充物件的行為或責任 * 讓新的行為加入類別,無需改變類別程式碼 * 轉接器 * 將一個介面轉換另一個介面 * 允許使用者使用新的程式庫和子集合,無需改變程式碼 ---
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.