擴充卡模式
将一個類的接口,轉換成客戶期望的另一個接口。擴充卡讓原本接口不相容的類可以合作無間。
應用分析
主要功能是完成接口轉換,通過擴充卡,将被适配者的接口轉換成滿足客戶需求的接口。
客戶使用擴充卡的過程如下:
客戶通過目标接口調用擴充卡的方法對擴充卡送出請求;
擴充卡使用被适配者接口把請求轉換成被适配者的一個或多個調用接口;
客戶接收到調用的結果,但并未察覺這一切是擴充卡在起轉換作用。
擴充卡接口分為:對象擴充卡接口和類擴充卡接口。
對象擴充卡——通過組合或委托被适配者實作
類擴充卡——通過繼承被适配者實作
代碼分析
//Adapter.h
#ifndef ADAPTER_H
#define ADAPTER_H
#include <iostream>
class Duck//鴨子抽象類
{
public:
virtual void quack()=0;
virtual void fly()=0;
};
class Turkey//火雞抽象類
{
public:
virtual void gobble()=0;
virtual void tfly()=0;
};
class MallardDuck:public Duck//鴨子實體類
{
public:
void quack()
{
std::cout<<"Duck Quack"<<std::endl;
}
void fly()
{
std::cout<<"Duck Fly"<<std::endl;
}
};
class WildTurkey:public Turkey//火雞實體類
{
public:
void gobble()
{
std::cout<<"Turkey gobble"<<std::endl;
}
void tfly()
{
std::cout<<"Turkey Fly"<<std::endl;
}
};
class TurkeyObjectAdapter:public Duck//對象擴充卡
{
private:
Turkey *t;
public:
TurkeyObjectAdapter(Turkey *t)
{
this->t=t;
}
void quack()
{
t->gobble();
}
void fly()
{
t->tfly();
}
};
class TurkeyClassAdapter:public Duck,private WildTurkey//類擴充卡
{
public:
void quack()
{
this->gobble();
}
void fly()
{
this->tfly();
}
};
#endif
//Main.cpp
//測試程式
#include "Adapter.h"
void print_Duck(Duck *d)
{
d->quack();
d->fly();
}
int main()
{
Duck *d=new MallardDuck();//定義鴨子對象
print_Duck(d);
Turkey *t=new WildTurkey();//定義火雞對象
Duck *ob_t=new TurkeyObjectAdapter(t);//對象擴充卡
print_Duck(ob_t);
Duck *cl_t=new TurkeyClassAdapter();//類擴充卡
print_Duck(cl_t);
return 0;
}