模式动机:有时软件复用的一个难题就是接口的不兼容性,适配器的职责就是为客户提供兼容的适配者接口,使得客户只需访问一类接口就可以调用合适的适配者,而其中的适配细节则有适配器来完成。
模式定义(Adapter Pattern):将一个接口转换为用户期望的接口,使得那些接口不兼容的类可以一起工作。
模式结构图:
模式代码:
bt_适配器模式.h:
#ifndef AP_H
#define AP_H
#include <iostream>
using namespace std;
/*
定义抽象目标类
*/
class Target
{
public:
virtual ~Target(){ }
virtual void request() = 0;
};
/*
适配者类
*/
class Adaptee
{
public:
void specificRequest()
{
cout << "成功调用适配者方法" << endl;
}
};
/*
适配器类
*/
class Adapter : public Target
{
public:
virtual void request()
{
pa->specificRequest();
}
private:
Adaptee* pa; // 指向合适的适配者
};
#endif // AP_H
测试用例.cpp:
#include "bt_适配器模式.h"
int main()
{
cout << "***** 适配器模式测试 *****" << endl;
Target* target = new Adapter; // 实例化一个与目标关联的适配器
target->request(); // 客户端调用
delete target;
return 0;
}
模式分析:该模式将目标类和具体适配者类解耦,增加了系统的灵活性和可扩展性,更换适配器时比较方便,不需要修改已有类,符合“开闭原则”。但是若需要更换一个已有的Adaptee方法比较麻烦,需要借助Adaptee的子类才能完成。同时如果想让一个Adapter与多个Adaptee(Adaptee及其子类)同时工作,也必须生成Adaptee的子类,并且需要在Adapter类中调用Adaptee子类的方法。