将一个接口转换成客户希望的另一个接口使得接口不兼容的那些类可以一起工作
一、缘由
适配器模式是我个人使用频率比较高的模式,十分简单实用。在许多情况下,我们自己的系统A,要使用既有对象B的接口,但无奈我们的既有系统A和B接口不兼容,这时候适配器可以帮我们解决这个问题。
二、实现
假设现在有一个函数
static void request(Target *target)
{
target->request();
}
现在我们既有的类Target::request
已经无法满足我们的需求,于是从第三方拿到了一个可以满足需求的Adaptee
类,可惜该类没有request
而只有一个request
方法。于是我们需要将Adataptee
包装成一个Adapter
类提供一个request
接口,同时包装类是一个Target
类的子类,这样就可以满足需求了,这种包装有两种思路,一种是使用多继承,同时继承Target
和Adaptee
类,一种是使用单继承,继承Target
然后关联一个Adaptee
。这就是我们说说的 适配器模式,两种思路分别叫做类适配器模式和对象适配器模式。 其UML类图如下:
类适配器
对象适配器
三、示例代码
示例代码如下:
#include
#include
using std::string;
class Target {
public:
virtual ~Target (){};
virtual void request(){
std::cout << "request = Target::request" << std::endl;
}
};
class Adaptee {
public:
virtual ~Adaptee (){};
virtual void specificRequest(){
std::cout << "request = Adaptee::request" << std::endl;
}
};
#ifdef CLASS_ADAPTER
class Adapter :public Target, public Adaptee {
public:
virtual ~Adapter (){};
virtual void request(){
specificRequest();
}
};
#else
class Adapter :public Target {
private:
Adaptee *daptee;
public:
Adapter():daptee(new Adaptee){}
virtual ~Adapter(){};
virtual void request(){
daptee->specificRequest();
}
};
#endif
static void request(Target *target)
{
target->request();
}
int main(void)
{
Target *target;
target = new Target;
request(target);
target = new Adapter;
request(target);
}
运行结果:
request = Target::request
request = Adaptee::request
示例代码2:
//!!!!!!!!! 加C++泛型编程与STL开发实战 QQ群:726114806下载代码和交流
#include <iostream>
using namespace std;
class ThreePhaseOutlet {
public:
void doThreePhasePlug() {
cout << "三相插头接入" << endl;
}
};
class TwoPhaseOutlet {
public:
virtual void doPlug() = 0;
};
//class OutletConverter :public TwoPhaseOutlet, public ThreePhaseOutlet {
//public:
// void doPlug() {
// doConvertor();
// doThreePhasePlug();
// }
// void doConvertor() {
// cout << "我们正在将三相插头转为两相插头" << endl;
// }
//};
//对象适配,它可以更加灵活一些
class OutletObjConvertor :public TwoPhaseOutlet {
public:
OutletObjConvertor(ThreePhaseOutlet* pOut) :m_pOut(pOut) {
}
void doPlug() {
doConvert();
m_pOut->doThreePhasePlug();
}
void doConvert() {
cout << "我们正在对一个二相插头本身进行转化" << endl;
}
private:
ThreePhaseOutlet* m_pOut;
};
int main(void) {
/*TwoPhaseOutlet* pOutlet = new OutletConverter();
pOutlet->doPlug();*/
TwoPhaseOutlet* pOutlet = new OutletObjConvertor(new ThreePhaseOutlet);
pOutlet->doPlug();
system("pause");
return 0;
}