适配器模式
使用场景:将一个类的接口转换成客户希望的另外一个接口,从而使原本由于接口不兼容而不能一起工作的类可以一起工作。适配器充当一个中介的角色,链接”他人”与”自己”。
例子:世界各国插座标准都不尽相同,甚至同一国家的不同地区也可能不一样。例如,中国一般使用两脚扁型,而俄罗斯使用的是双脚圆形。那么,如果去俄罗斯旅游,就会出现一个问题:我们带去的充电器为两脚扁型,而他们提供的插座为双脚圆形,如何给手机充电呢?总不能为了旅客而随意更改墙上的插座吧,而且俄罗斯人一直都这么使用,并且用的很好。俗话说入乡随俗,那么只能自己想办法解决了。
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号