目录
1.意图
主要思想是将类的接口转换为客户端所期望的接口。Adapter模式将那些因为接口不同而无法协作的类聚集起来,一起工作。Adapter模式的意图就是,如果可以对接口进行修改,则可以重用已存在的软件。
2.UML类图
类模式。通过多重继承来实现。通过public获得了接口的继承,通过private获得了实现的继承。
STL中的stack,就是从vector适配而来的。当stack执行push()操作时,底层的vector执行的是vector::push_back()。
3.代码实现
#include<iostream>
//所需要的接口(目的接口)
class Charger {
public:
virtual void charge() = 0;
};
//Legacy charger(Adaptee)
class LegacyCharger {
public:
LegacyCharger(unsigned int mint):minutes(mint){
}
void oldCharge() {
std::cout<<"LegacyCharger: oldCharge()"<<std::endl;
}
private:
unsigned int minutes;
};
//Adapter
class ChargerAdapter:public Charger, private LegacyCharger {
public:
ChargerAdapter(unsigned int mint):LegacyCharger(mint) {
std::cout<<"ChargerAdapter Constructor"<<std::endl;
}
void charge() {
std::cout<<"ChargerAdapter: charge()"<<std::endl;
oldCharge();
}
};
int main()
{
Charger *cg = new ChargerAdapter(50);
cg->charge();
delete cg;
}
运行结果为:
ChargerAdapter Constructor
ChargerAdapter: charge()
LegacyCharger: oldCharge()
基于运行结果,可以得到下面的分析:
client认为自己所访问的对象就是Charger.
ChargerAdapter通过多重继承,实现了让LegacyCharger来实现自己的方法charge(). 但是,LegacyCharger中并没有相同的charger()方法。
4.总结
适配器将一个类的接口,转换为另外的,但是可以兼容的接口。这个方式与proxy代理模式有些类似。但是,其中adapter类的接口与原始类的接口可能是不同的。
通过上面的例子可以看出,适配器模式用于对一个已经存在的API,暴露出一个不同的接口,使得它可以与其它的代码工作。另外,使用适配器模式,可以将各种混杂的接口,进行转换,使得它们可以提供一致的API。
桥接模式与adapter对象有着相似的结构,但是桥接模式的用途不同:它将自己的实现与接口分离,这样实现可以进行不同的变化,相互独立。而适配器意味着改变一个已存在对象的接口。