## 模式定義:
? ? ? 適配器模式將一個類的接口,轉換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。
? ? ? 適配器可以分為類適配器和對象適配器。
? ? ? 類適配器使用多重繼承對一個接口與另一個接口進行匹配。
? ? ? 對象適配器依賴于對象組合。
客戶使用適配器的過程:
1.??????客戶通過目標接口調用適配器的方法對適配器發出請求。
2.??????適配器使用被適配者接口把請求轉換成被施培者的一個或多個調用接口
3.??????客戶接收到調用的結果,但并未察覺這一切是適配器在起轉換作用。
## 模式結構:
? ? ? 類適配器

對象適配器

## 舉例:
現在假設你缺少鴨子對象(叫聲為Quack,飛行輸出”I’m flying !”),想用一些火雞對象(叫聲為”Gobble gobble” 飛行輸出”I’m flying a short distance!”)來冒充。顯而易見,因為火雞的接口(行為)不同,所以我們不能公然拿來使用。
## UML設計:

## 編程實現及執行結果:
~~~
#include <iostream>
using namespace std;
//定義鴨子類
class Duck
{
public:
virtual void quack(){};
virtual void fly(){};
};
//定義綠頭鴨
class MallardDuck : public Duck
{
public:
void quack()
{
cout << "Quack" << endl;
}
void fly()
{
cout << "I'm flying" << endl;
}
};
//定義火雞
class Turkey
{
public:
virtual void gobble(){}
virtual void fly(){}
};
//定義野火雞
class WildTurkey : public Turkey
{
public:
void gobble()
{
cout << "Gobble gobble" << endl;
}
void fly()
{
cout << "I'm flying a short distance" << endl;
}
};
//定義火雞適配器
class TurkeyAdapter : public Duck
{
public:
TurkeyAdapter(Turkey* tur):turkey(tur){}
void quack()
{
turkey->gobble();
}
void fly()
{
turkey->fly();
}
private:
Turkey* turkey;
};
//客戶代碼
int main()
{
Duck* duck = new MallardDuck();
duck->quack();
duck->fly();
Duck* turkeyAdapter = new TurkeyAdapter(new WildTurkey());
turkeyAdapter->quack();
turkeyAdapter->fly();
return 0;
}
~~~
執行結果:
**Quack**
**I'mflying**
**Gobblegobble**
**I'mflying a short distance**
**請按任意鍵繼續. . .**
## 適配器和裝飾者模式比較:
適配器:將一個接口轉成另一個接口。包裝某些對象,讓它們的接口看起來不像自己而像別的東西。
裝飾者:不改變接口,但加入責任。將對象包裝起來,讓新行為加入類中。