按照设计模式书中介绍:
意图:
将一个类的接口转换成客户希望的另外一个接口。adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用性:
当使用已经存在的一个类,而它的接口不符合你的需求时
当想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类一起协同工作
你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。
参与者:
Target-----定义client使用的与特定领域相关的接口
client-------定义与符合target接口的对象协同
adaptee---定义一个已经存在的接口,这个接口需要适配
adapter----对adaptee的接口与target接口进行适配
接下来我们就将适配器模式用程序展示一下:
adapter.h
//设计模式之Adapter
/*
将一个类的接口转换成客户希望的另外一个接口,解决两个已有接口之间的不匹配问题
使原本由于接口不兼容而不能一起工作的那些类可以一起工作
*/
#include <stdio.h>
//定义抽象接口
//即客户调用时,调用的接口
class target
{
public:
virtual void request() = 0;
};
//定义具体行为
//即用户操作的具体行为
class realmethod
{
public:
void request1()
{
printf("request1 ....\n");
}
};
//方式一
//通过继承方式将抽象接口转而调用具体行为
class adapter1 : public realmethod,private target
{
public:
virtual void request()
{
request1();
}
};
//方式二
class adapter2 : private target
{
public:
virtual void request()
{
//将抽象接口具体化
_realmethod.request1();
}
private:
//声明一个抽象接口的对象
realmethod _realmethod;
};
adapter.cpp
#include "adapter.h"
int main()
{
//首先new 一个adapter,调用request时会调用target中的request,进而多态成adapter中的request,进而进入到realmethod中
target *p = (target*)new adapter1();
p->request();
delete p;
p = (target*) new adapter2();
p->request();
delete p;
return 0;
}
上例我们使用了2种方法来模拟adapter模式,注意一下类的结构。
网络上有一个比较经典的比喻来形容adapter模式,现在市面上有很多转换线,用于不同的通讯接口之间的转换,如:
RS232 -----> 线路转换器 -----> USB -----> 计算机;
RJ-45 -----> 线路转换器 -----> USB -----> 计算机;
PS/2 -----> 线路转换器 -----> USB -----> 计算机;
外接光驱-----> 线路转换口 -----> USB -----> 计算机;
移动硬盘-----> 线路转换口 -----> USB -----> 计算机;
其中USB就相当于本例中的target类,适配器类的接口,即纯虚基类
线路转换器和线路转换口就相当于本例中的adapter1、adapter2,具体执行转换任务
RS232、RJ-45、PS/2、外接光驱、移动硬盘相当于本例中的realmethod,它实际上是其本质的内容。
其实adapter模式在STL中有大量使用。具体可以查看STL源码。