網(wǎng)站建設(shè)phpstudy網(wǎng)站建設(shè)網(wǎng)站定制
一,定義
適配器模式:結(jié)構(gòu)型模式之一,適配器提供客戶類需要的接口,適配器的實(shí)現(xiàn)就是把客戶類的請求轉(zhuǎn)化為對適配者的相應(yīng)接口的調(diào)用。也就是說:當(dāng)客戶類調(diào)用適配器的方法時,在適配器類的內(nèi)部將調(diào)用適配者類的方法,而這個過程對客戶類是透明的,客戶類并不直接訪問適配者類。因此,適配器可以使由于接口不兼容而不能交互的類可以一起工作。
適配器模式分為兩種:
類適配器(適配器和適配者是繼承關(guān)系)
對象適配器(適配器和適配者是關(guān)聯(lián)關(guān)系)
二,類圖


三,成員職責(zé)
抽象目標(biāo)角色:目標(biāo)抽象類定義客戶所需接口,可以是一個抽象類或接口,也可以是具體類。
適配者角色:適配器可以調(diào)用另一個接口,作為一個轉(zhuǎn)換器,對Adaptee和Target進(jìn)行適配,適配器類是適配器模式的核心
在類適配器中,它通過繼承Target和Adaptee使二者產(chǎn)生聯(lián)系
在對象適配器中,它通過繼承Target并關(guān)聯(lián)一個Adaptee對象(設(shè)置為私有成員)使二者產(chǎn)生聯(lián)系。
適配器角色:適配者即被適配的角色,它定義了一個已經(jīng)存在的接口,這個接口需要適配,適配者類一般是一個具體類,包含了客戶希望使用的業(yè)務(wù)方法。
四,實(shí)現(xiàn)
我們給出以下場景:
現(xiàn)在有兩種規(guī)格的插座:中式規(guī)格插座和英式規(guī)格插座,我們現(xiàn)在不改變英國插座的基礎(chǔ),使英國可以轉(zhuǎn)化為中國插座的規(guī)格


英國插座(抽象目標(biāo)類Target)
class uksoket_target
{
public:virtual void ukplug(){cout << "英國插座:英式規(guī)格" << endl;}
};
中國插座(適配者類Adaptee)
class chsoket_adaptee //適配者
{
public:void chplug(){cout << "中式規(guī)格" << endl;}
};
類適配器
英式插座適配器(適配器類Adapter)
class uksocket_adapter : public uksoket_target,public chsocket_adaptee
{
public:void ukplug() override{cout << "英國插座:";chplug();}
};
測試方法與主函數(shù)
void test()
{uksoket_target* uk1 = new uksoket_target();uksoket_target* uk2 = new uksocket_adapter();uk1->ukplug();uk2->ukplug();delete uk1;uk1 = nullptr;delete uk2;uk2 = nullptr;
}int main()
{test();return 0;
}

對象適配器
英國適配器(適配器類Adapter)
class uksocket_adapter : public uksoket_target
{
private:chsocket_adaptee* ch;
public:void ukplug() override{cout << "英國插座:";ch->chplug();}
};
測試方法與主函數(shù)
void test()
{uksoket_target* uk1 = new uksoket_target();uksoket_target* uk2 = new uksocket_adapter();uk1->ukplug();uk2->ukplug();delete uk1;uk1 = nullptr;delete uk2;uk2 = nullptr;
}int main()
{test();return 0;
}

五,優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
將目標(biāo)類和適配器類解耦。通過引入一個適配器類來重用現(xiàn)有的適配者類,而無須修改原有的代碼。
增加了類的透明性和復(fù)用性,將具體的實(shí)現(xiàn)封裝在適配器類中,對于客戶端類來說是透明的,而且提高了適配器的復(fù)用性。
靈活性和擴(kuò)展性都非常好,符合開閉原則
缺點(diǎn):
過多地使用適配器,會讓系統(tǒng)非常零亂,不易整體進(jìn)行把握。比如,明明看到調(diào)用的是 A 接口,其實(shí)內(nèi)部被適配成了 B 接口的實(shí)現(xiàn),一個系統(tǒng)如果太多出現(xiàn)這種情況,無異于一場災(zāi)難。因此如果不是很有必要,可以不使用適配器,而是直接對系統(tǒng)進(jìn)行重構(gòu)。
六,適用場景
當(dāng)想使用一個已存在的類,而它的接口不符合需求時。
你想創(chuàng)建一個可復(fù)用的類,該類可以與其他不相關(guān)的類或不可預(yù)見的類協(xié)同工作。