适配器模式(Adapter Pattern)
适配器模式是作为两个不兼容的接口之间的桥梁
,增加一个适配器类使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
主要解决的问题:
主要解决在软件系统中,常常要将一些“现存的对象”放到新环境中,而新环境的接口是现有对象不能满足的。
我们用下面的情境来解释一下适配器模式:
我们用电脑投影到投影仪上时,投影仪Project有VAG
和HDMI
以及Type-C
等多种接口
在前几年,投影仪和电脑的接口都是VAG
,无疑,直接连接就可:
代码实现如下:
class VGA
{
public:
virtual void play() = 0;
string getType() const { return "VGA"; }
};
//支持VGA接口的投影仪
class TV01 :public VGA
{
public:
void play() { cout << "通过VGA接口连接投影仪,进行视频播放" << endl; }
};
//电脑:只支持VGA接口
class LenovoComputer
{
public:
void PlayMovie(VGA* pVGA)
//由于该电脑只支持VGA接口,所以该方法的参数也只能支持VGA接口的指针/引用
{
pVGA->play();
}
};
int main()
{
LenovoComputer computer;
computer.PlayMovie(new TV01());
}
随着技术的发展,有了新的接口,和原来的电脑不适配了,我们也许会买新的,但是你得有钱,买新电脑就是代码重构。
对于我们这些穷人来说,买个转接口是最好的方法,适配器通过继承自原有的接口,调动内部所存在新接口的方法,然后提供给电脑一个原有的接口!
//新投影仪 只支持HDMI接口
class HDMI
{
public:
virtual void play() = 0;
string getType() const { return "HDMI"; }
};
//投影仪
class TV02 :public HDMI
{
public:
void play() { cout << "通过HDMI接口连接投影仪,进行视频播放" << endl; }
};
//由于电脑(VGA接口)和投影仪(HDMI接口)无法直接相联,所以需要添加适配器类
class VGAToHDMIAdapter :public VGA//必须继承老接口,继承新接口与否视情况而定
{
public:
VGAToHDMIAdapter(HDMI* p) :pHDMI_(p) {}
void play()//该方法就是转换头,做不同接口的信号转换
{
pHDMI_->play();
}
private:
HDMI* pHDMI_;
};
int main()
{
LenovoComputer computer;
computer.PlayMovie(new VGAToHDMIAdapter(new TV02()));
}