C++设计模式之适配器模式
将一个接口转换成客户希望的另一个接口使得接口不兼容的那些类可以一起工作
一、缘由
适配器模式是我个人使用频率比较高的模式,十分简单实用。在许多情况下,我们自己的系统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 <string>
#include <iostream>
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