target(目標介面):所期望得到的介面
adaptee(適配者):需要適配的類
adapter(介面卡):該模式的核心,具有將 adaptee 包裝為 target 的職責
類介面卡和物件介面卡
從實現層面上劃分,介面卡模式分為兩種:
類介面卡(多繼承方式)
物件介面卡(物件組合方式)
那麼,實際應用中如何在二者之間進行選擇?
類介面卡包含以下特點:
由於 adapter 直接繼承自 adaptee 類,所以,在 adapter 類中可以對 adaptee 類的方法進行重定義。
如果在 adaptee 中新增了乙個抽象方法,那麼 adapter 也要進行相應的改動,這樣就帶來高耦合。
如果 adaptee 還有其它子類,而在 adapter 中想呼叫 adaptee 其它子類的方法時,使用類介面卡是無法做到的。
物件介面卡包含以下特點:
有的時候,你會發現,去構造乙個 adaptee 型別的物件不是很容易。
當 adaptee 中新增新的抽象方法時,adapter 類不需要做任何調整,也能正確的進行動作。
可以使用多型的方式在 adapter 類中呼叫 adaptee 類子類的方法。
由於物件介面卡的耦合度比較低,所以在很多的書中都建議使用物件介面卡。在我們實際專案中,也是如此,能使用物件組合的方式,就不使用多繼承的方式。
優缺點優點:
可以讓任何兩個沒有關聯的類一起執行
提高了類的復用
增加了類的透明度
靈活性好
缺點:過多地使用介面卡,會讓系統非常零亂,不利於整體把控。
例如,看到呼叫的是 a 介面,內部卻被適配成了 b 介面的實現,系統如果出現太多類似情況,無異於一場災難。因此,如果不是很必要,可以不使用介面卡,而是直接對系統進行重構。
適用場景
當想使用乙個已存在的類,而它的介面不符合需求時。
你想建立乙個可復用的類,該類可以與其他不相關的類或不可預見的類協同工作。
你想使用一些已經存在的子類,但是不可能對每乙個都進行子類化以匹配它們的介面,物件介面卡可以適配它的父介面。
建立目標介面
// target.h
#ifndef target_h
#define target_h
#include
// 俄羅斯提供的插座
class
irussiasocket
;#endif // target_h
建立適配者// adaptee.h
#ifndef adaptee_h
#define adaptee_h
#include
using
namespace
std;
// 自帶的充電器 - 兩腳扁型
class owncharger
};#endif // adaptee_h
建立介面卡// adapter.h
#ifndef adapter_h
#define adapter_h
#include "target.h"
#include "adaptee.h"
#ifndef safe_delete
#define safe_delete(p) }
#endif
// 電源介面卡
class poweradapter : public irussiasocket
~poweradapter()
void charge()
private:
owncharger *m_pcharger; // 持有需要被適配的介面物件 - 自帶的充電器
};#endif // adapter_h
建立客戶端// main.cpp
#include "adapter.h"
int main()
介面卡模式(類介面卡 物件介面卡)
做個筆記 引用 public inte ce usb public inte ce psp public class usber implements usb 類介面卡 psp適用usb介面 public class usbadapter extends usber implements psp 物...
介面卡模式 預設介面卡,類介面卡,物件介面卡
模式思想 改變乙個類的對外介面 增加或減少 以滿足不同外部呼叫者的需求 角色成員 目標介面 target 客戶所期待的介面。目標可以是具體的或抽象的類,也可以是介面。需要適配的類 adaptee 需要適配的類或適配者類。介面卡 adapter 通過包裝乙個需要適配的物件,把原介面轉換成目標介面。適配...
設計模式 介面卡模式 類介面卡 物件介面卡
乙個小例子,便於理解,上 這是我們造的。現在想用這個方法。public class adaptee 類介面卡。對我們想要的方法封裝一下,target就能像之前一樣,呼叫request方法即可。public class adapter1 extends adaptee implements targe...