我們筆記本電腦的工作電壓是20v,而家庭額定電壓220v,如何讓20v的筆記本電腦能夠在220v的電壓下工作?為了解決這種問題,我們引入了一個電源擴充卡(ac adapter),俗稱充電器,有了這個電源擴充卡,生活用電和筆記本電腦即可相容
同樣在軟體開發中,有時也存在類似這種不相容的情況,我們也可以像引入一個電源擴充卡一樣引入一個稱之為擴充卡的角色來協調這些存在不相容的結構,這種設計方案即為擴充卡模式。
将一個類的接口轉換成客戶希望的另外一個接口。adapter模式使得原本由于接口不相容而不能一起工作的那些類可以一起工作。——gang of four
模式中的角色
1 目标接口(target):客戶所期待的接口。目标可以是具體的或抽象的類,也可以是接口。
2 需要适配的類(adaptee):需要适配的類或适配者類。
3 擴充卡(adapter):通過包裝一個需要适配的對象,把原接口轉換成目标接口。
共有兩類擴充卡模式:
①對象擴充卡模式
在這種擴充卡模式中,擴充卡容納一個它包裹的類的執行個體。在這種情況下,擴充卡調用被包裹對象的實體實體。
②類擴充卡模式
這種擴充卡模式下,擴充卡繼承自已實作的類(一般多重繼承)。
對象擴充卡”通過組合除了滿足“使用者期待接口”還降低了代碼間的不良耦合。在工作中推薦使用“對象适配”。
#include <iostream>
// 目标類 -=> 對應于目标抽象類,内含我們現在項目需要的接口
// 相當于20v的電壓接口
class target
{
public :
virtual ~target( )
{
}
virtual void request( ) // 希望獲得的系統接口
std::cout <<"target::request" <<std::endl;
};
// 需要适配的類, 内含不符合要求的接口
// 相當于已經提供好的220v的電壓插座接口
class adaptee
void specialrequest( )
std::cout <<"adaptee::specialrequest..." <<std::endl;
// 擷取接口的擴充卡類,
// 适配後的符合要求的接口
// 将目标類adatee中不符合要求的接口, 轉換為target中的接口類型
// 相當于一個轉接器,将成員m_adaptee[adaptee]的220v電壓接口, 轉換成target類的20v電壓接口
class adapter : public target
adapter( )
:m_adaptee(new adaptee)
//this->m_adaptee = new adaptee( );
~adapter( )
if(this->m_adaptee != null)
{
delete this->m_adaptee;
this->m_adaptee = null;
}
void request( ) // 我們需要的目标接口
// 将成員m_adaptee[adaptee]的220v電壓接口, 轉換成target類的20v電壓接口
this->m_adaptee->specialrequest( ); // 調用适配類的特殊(不符合)接口
adaptee *m_adaptee;
int main(void)
target *target = new adapter( ); // 定義一個目标接口
target->request( );
delete target;
target = null;
}
當客戶在接口中定義了他期望的行為時,我們就可以應用擴充卡模式,提供一個實作該接口的類,并且擴充已有的類,通過建立子類來實作适配。
// 目标接口資訊
// 需要适配的類, 内喊不符合要求的接口
class adapter : public target, adaptee
void request( )
adaptee::specialrequest( );
int main()
target *target = new adapter( );
return 0;
}
轉載:http://blog.csdn.net/gatieme/article/details/17993509