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