适配器模式是一种结构型设计模式,其核心目的是允许两个已存在的不兼容的接口能够一起工作。适配器这一角色,通过将一个类的接口转换成客户期望的另一个接口,使原本借口不兼容的类可以协同工作。
案例引入
这里举一个例子,一起来说明该接口的工作模式:
电脑投影到投影仪上,一共可以有VGA、HDMI、TypeC三种接口,
现在假设我们这里只有VGA线,电脑恰好也支持VGA线,所以有如下案例:
#include <iostream>
using namespace std;
class VGA {
public:
virtual void play() = 0;
};
class TV01 : public VGA {
public:
void play () {
cout << "通过VGA接口连接投影仪,进行视频播放" << endl;
}
};
class Computer {
public:
//由于电脑只支持VGA接口,所以该方法的参数也只能支持VGA接口的指针/引用
void playVideo(VGA *pVGA) {
pVGA->play();
}
};
int main () {
Computer computer;
computer.playVideo(new TV01());
}
现在我们需求改变,进了一批新的投影仪,但是新的投影仪都是只支持HDMI接口。
class HDMI {
public:
virtual void play() = 0;
};
class TV02 : public HDMI {
public:
void play () {
cout << "通过HDMI接口连接投影仪,进行视频播放" << endl;
}
};
那么我们在函数调用的时候,你觉得我们可以直接通过playVideo接口传入这样的参数吗?
computer.playVideo(new TV02());
那肯定是不行的,因为我们电脑只支持VGA接口,接口函数如下:
video playVideo(VGA *pVGA) {
pVGA->paly();
}
我们如何去解决接口不兼容的问题呢?
- 直接换一个支持HDMI接口的电脑,这个就叫代码重构
- 买一个转换头,能够把VGA信号专程HDMI信号,这个就叫适配器模式。这个叫添加适配器类
提供适配器类
//电脑(VGA接口)和投影仪(HDMI接口)无法直接相连,所以需要添加适配器类
class VGAToHDMIAdapter : public VGA {
public:
VGAToHDMIAdapter(HDMI *p) : pHdmi(p) {}
void play() { //该方法就相当于是转换头,做不同信号转换的
pHdmi->play();
}
private:
HDMI *pHdmi;
};
最后我们在做函数调用的时候,加上一个适配器对象,通过适配器对象调用就可以了。
int main () {
Computer computer;
// computer.playVideo(new TV01());
computer.playVideo(new VGAToHDMIAdapter(new TV02()));
}