深入解析設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用
適配器模式屬于結(jié)構(gòu)型的設(shè)計(jì)模式,它是結(jié)構(gòu)型設(shè)計(jì)模式之首(用的最多的結(jié)構(gòu)型設(shè)計(jì)模式)。
適配器設(shè)計(jì)模式也并不復(fù)雜,適配器它是主要作用是將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口這樣使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。適配器模式有兩種:1.類的適配器 2.對象適配器,對象適配器更多一些。
示例:比如你在網(wǎng)上買了一個手機(jī),但是買家給你發(fā)回來了一個3接頭的充電器,但是恰好你又沒有3接頭的插槽,只有2個接口的插槽,于是你很直然地便會想到去找你個3接口轉(zhuǎn)兩接口的轉(zhuǎn)換器。簡單的分析下這個轉(zhuǎn)換器便是我們這里的適配器Adapter。三相插頭便是我們要適配的Adaptee,兩相插類適配器-----在我看來C++的類適配器的用多重繼承實(shí)現(xiàn),并提供適配后的接口。

這是你的三相插頭
class ThreePhaseOutlet
{
public:
void doThreePhasePlugin()
{
cout<<"三相插頭強(qiáng)勢插入!"<<endl;
}
};
這是你想要的兩相插頭
class TwoPhaseOutlet
{
public:
virtual void doPlugin() = 0;
};
然后你將需要找到一個轉(zhuǎn)接頭,將三相插頭轉(zhuǎn)換為“兩相插頭”
class OutletConvertor: public TwoPhaseOutlet,public ThreePhaseOutlet
{
public:
void doPlugin()
{
doConvertor();
doThreePhasePlugin();
}
void doConvertor()
{
cout<<"三相插頭轉(zhuǎn)為兩廂插頭!"<<endl;
}
};
現(xiàn)在你可以強(qiáng)勢插入兩相的插口了。
TwoPhaseOutlet* outlet = new OutletConvertor(); outlet->doPlugin();
對象適配器模式-----對象適配器是將需要適配的對象進(jìn)行包裝然后提供適配后的接口。

對象適配器的 三相插口和轉(zhuǎn)接頭的代碼和上面一致。只是整合步驟不一致
class OutletConvertor : public TwoPhaseOutlet
{
public:
void doPlugin()
{
doConvertor();
m_out.doThreePhasePlugin();
}
void doConvertor()
{
cout<<"三相插頭轉(zhuǎn)為兩廂插頭!"<<endl;
}
ThreePhaseOutlet m_out;
};
對象適配器相比類適配器來說更加靈活,他可以選擇性適配自己想適配的對象。例如我們下面把代碼改成這樣,你也許就會明白為什么我這樣說:
class OutletConvertor : public TwoPhaseOutlet
{
public:
OutletConvertor(ThreePhaseOutlet out)
{
m_out = out;
}
void doPlugin()
{
doConvertor();
m_out.doThreePhasePlugin();
}
void doConvertor()
{
cout<<"三相插頭轉(zhuǎn)為兩廂插頭!"<<endl;
}
ThreePhaseOutlet m_out;
};
我們在構(gòu)造的時(shí)候?qū)⒕唧w需要適配的適配對象傳入,這樣便可以根據(jù)傳入不同的對象,從而對該對象進(jìn)行適配。而類適配器卻無法選擇對象,他是對整個類進(jìn)行適配。也就是把所有的三相插口全部轉(zhuǎn)換為兩相的,而不是針對某一個。
在以下各種情況下使用適配器模式:
1、 系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要。
2、 想要建立一個可以重復(fù)使用的類,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來引進(jìn)的類一起工作。這些源類不一定有很復(fù)雜的接口。
3、 (對對象適配器而言)在設(shè)計(jì)里,需要改變多個已有子類的接口,如果使用類的適配器模式,就要針對每一個子類做一個適配器,而這不太實(shí)際。
Adapter模式在實(shí)現(xiàn)時(shí)有以下這些值得注意的地方:
1、 目標(biāo)接口可以省略,模式發(fā)生退化。但這種做法看似平庸而并不平庸,它可以使Adaptee不必實(shí)現(xiàn)不需要的方法(可以參考Default Adapter模式)。其表現(xiàn)形式就是父類實(shí)現(xiàn)缺省方法,而子類只需實(shí)現(xiàn)自己獨(dú)特的方法。這有些像模板(Template)模式。
2、 適配器類可以是抽象類。
3、 帶參數(shù)的適配器模式。使用這種辦法,適配器類可以根據(jù)參數(shù)返還一個合適的實(shí)例給客戶端。
相關(guān)文章
C/C++ Windows SAPI實(shí)現(xiàn)文字轉(zhuǎn)語音功能
本文通過封裝Windows SAPI(Speech Application Programming Interface),提供了一個現(xiàn)代化的C++接口實(shí)現(xiàn)文字轉(zhuǎn)語音功能,這篇文章重點(diǎn)給大家介紹C/C++ Windows SAPI自實(shí)現(xiàn)文字轉(zhuǎn)語音功能,感興趣的朋友一起看看吧2025-02-02
C語言創(chuàng)建動態(tài)dll和調(diào)用dll(visual studio 2013環(huán)境下)
本篇文章主要介紹了C語言創(chuàng)建動態(tài)dll和調(diào)用dll(visual studio 2013環(huán)境下),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-11-11
Qt C++實(shí)現(xiàn)錄屏錄音功能的示例詳解
實(shí)現(xiàn)一個錄屏+錄音的功能且需要快速開發(fā),Qt無疑是一個非常好的選擇。他有豐富的類庫和接口可以很好的滿足開發(fā)需求。本文就來和大家聊聊具體的實(shí)現(xiàn)方法吧2023-03-03
解決C語言中使用scanf連續(xù)輸入兩個字符類型的問題
這篇文章主要介紹了解決C語言中使用scanf連續(xù)輸入兩個字符類型的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
約瑟夫環(huán)問題(數(shù)組法)c語言實(shí)現(xiàn)
這篇文章主要介紹了約瑟夫環(huán)問題(數(shù)組法)c語言實(shí)現(xiàn),有需要的朋友可以參考一下2013-12-12
使用VC6.0對C語言程序進(jìn)行調(diào)試的基本手段分享
這篇文章主要介紹了用VC6.0開發(fā)c語言程序的時(shí)候調(diào)試代碼的一些小技巧,需要的朋友可以參考下2013-07-07

