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