適配器模式
使用場景:將一個類的接口轉換成客戶希望的另外一個接口,從而使原本由于接口不兼容而不能一起工作的類可以一起工作。適配器充當一個中介的角色,鏈接”他人”與”自己”。
例子:世界各國插座標準都不盡相同,甚至同一國家的不同地區也可能不一樣。例如,中國一般使用兩腳扁型,而俄羅斯使用的是雙腳圓形。那么,如果去俄羅斯旅游,就會出現一個問題:我們帶去的充電器為兩腳扁型,而他們提供的插座為雙腳圓形,如何給手機充電呢?總不能為了旅客而隨意更改墻上的插座吧,而且俄羅斯人一直都這么使用,并且用的很好。俗話說入鄉隨俗,那么只能自己想辦法解決了。
1. 對象適配器:
俄羅斯提供的插座:(他人的)
// target.h
#ifndef TARGET_H
#define TARGET_H
#include <iostream>
// 俄羅斯提供的插座
class IRussiaSocket
{
public:
// 使用雙腳圓形充電(暫不實現)
virtual void Charge() = 0;
};
#endif // TARGET_H
再來看看我們自帶的充電器:(自己的)
// adaptee.h
#ifndef ADAPTEE_H
#define ADAPTEE_H
#include <iostream>
using namespace std;
// 自帶的充電器 - 兩腳扁型
class OwnCharger
{
public:
void ChargeWithFeetFlat() {
cout << "OwnCharger::ChargeWithFeetFlat" << endl;
}
};
#endif // ADAPTEE_H
創建適配器:電源適配器(中介)
// adapter.h
#ifndef ADAPTER_H
#define ADAPTER_H
#include "target.h"
#include "adaptee.h"
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
// 電源適配器
class PowerAdapter : public IRussiaSocket
{
public:
PowerAdapter() : m_pCharger(new OwnCharger()){}
~PowerAdapter() {
SAFE_DELETE(m_pCharger);
}
void Charge() {
// 使用自帶的充電器(兩腳扁型)充電
m_pCharger->ChargeWithFeetFlat();
}
private:
OwnCharger *m_pCharger; // 持有需要被適配的接口對象 - 自帶的充電器
};
#endif // ADAPTER_H
使用方法:
// main.cpp
#include "adapter.h"
int main()
{
// 創建適配器
IRussiaSocket *pAdapter = new PowerAdapter();
// 充電
pAdapter->Charge();
SAFE_DELETE(pAdapter);
getchar();
return 0;
}
2.類適配器
Target 和 Adaptee 保持不變,只需要將 Adapter 變為多繼承的方式即可:
#ifndef ADAPTER_H
#define ADAPTER_H
#include "target.h"
#include "adaptee.h"
// 電源適配器
class PowerAdapter : public IRussiaSocket, OwnCharger
{
public:
PowerAdapter() {}
void Charge() {
// 使用自帶的充電器(兩腳扁型)充電
ChargeWithFeetFlat();
}
}
除此之外,其他用法和“對象適配器”一致。
參考:https://blog.csdn.net/liang19890820/article/details/66973296
浙公網安備 33010602011771號