适配器模式将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起的两个类能够在一起工作。
适配器模式通用类图
Target 目标角色,该角色定义把其他类转换为何种接口,也就是期望的接口。
Adaptee 源角色,是已经存在的,但与当前系统接口不兼容的数据类型设计,需要被转换。
Adapter 适配器角色, 适配器模式的核心角色,负责把源角色转换为目标角色。
从上面的通用类图中可以看出,事实上Adapter实现了多重继承,同时含有Adaptee中定义的数据成员和Target中定义的接口,而其功能就是使用Target中定义的接口来访问Adaptee中的数据成员和操作。
适配器模式是一种补救模式,一般不会用在项目的最初设计上,往往是在后期拓展功能时,发现不同平台之间的接口的设计不一致而又要互相引用,适配器就是用来缓解这一矛盾的。
适配器模式的优点
- l 适配器模式可以让两个没有任何关系的类在一起运行。
- l 增加了类的透明性
- l 提高了类的复用度
- l 灵活性非常好
C++通用源码
#include <iostream>
using namespace std;
class Target{ //目标角色接口
public:
virtual void request()=0;
};
class ConcreteTarget:public Target{ //具体的目标角色
public:
void request(){cout<<"if you need any help, pls call me!"<<endl;}
};
class Adaptee{ //源角色
public:
void doSomething(){cout<<"I'm kind of busy, leave me alone, pls!"<<endl;}
};
class Adapter:public Target,private Adaptee{ //适配器角色,使用private继承Adaptee,用户就不能直接访问Adaptee对象的成员,而必须通过Adapter
public:
void request(){
Adaptee::doSomething();
}
};
int main()
{
Target *target = new ConcreteTarget();
target->request();
Target *target2 = new Adapter();
target2->request();
return 0;
}
运行结果