天天看点

C++设计模式 | Adapter适配器模式

概念

适配器模式:将一个类的接口转化成客户希望的另外一个接口Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。让不兼容的接口可以在一起工作

适配器模式在生活中的一些例子

1.我国的家庭电压一般都为220V,但是平时我们使用手机或者电脑等一些电器时,这些电器的工作电压一般都不到20V,所以如何能够让我们的电脑或者手机在220V电压下正常工作呢。显然不可能。因此我们的电源线上都会有一个配接器,主要是将220V电压转为电脑能够工作的电压。这个配接器就是连接电源220V和电脑20V的一个接口。

2.我记得小时候家里开始普及自来水的时候。在街道旁边会铺设自来水管,这些水管口径都非常大,但是引入家里的管道口径却很小。这时候就要想办法能够将这两个水管连接起来。这就需要一个转换接口

C++设计模式 | Adapter适配器模式

模式结构图

C++设计模式 | Adapter适配器模式

代码实现

//目标接口类
class Target
{
public:
    virtual void Request() { std::cout << "Target::Request" << std::endl; }
};
//最终客户端要使用的类
class Adaptee
{
public:
    void SpecificRequest() { std::cout << "Adaptee::SpecificRequest" << std::endl; }
};
//  适配器类  转换接口类
class Adapter : public Target
{
public:
    Adapter() { _ade = new Adaptee(); }
    ~Adapter()
    {
        if (_ade != nullptr)
        {
            delete _ade;
            _ade = nullptr;
        }
    }
    //这样 虽然调用的是target接口 其实调用的是adaptee接口
    void Request() { _ade->SpecificRequest(); }

private:
    Adaptee *_ade;
};

int main(int argc, char *argv[])
{
    Target *adt = new Adapter();
    adt->Request();
    return 0;
}
           
C++设计模式 | Adapter适配器模式

 具体的例子的代码实现

比如:我们使用电脑时,有时候要将电脑内容投影到投影仪上。

我们的电脑只支持VGA接口,这时候我们用VGA接口的投影仪。

//抽象类  VGA接口
class VGA
{
public:
    virtual void play() = 0;
};
//VGA接口的投影仪
class TV1 : public VGA
{
public:
    void play()
    {
        cout<<"使用VGA接口的TV1播放视频"<<endl;
    }
};
class Computer
{
public:
    void playvideo(VGA *vag)
    {
        vag->play();
    }
    
};
int main()
{
    Computer c;
    c.playvideo(new TV1());
    return 0;
}
           
C++设计模式 | Adapter适配器模式

但是现在我们只有HDMI接口的投影仪,而电脑只支持VGA接口,这时候该怎么办呢?

因此我们需要使用一个信号转换器,将电脑可以支持的VGA信号转换为投影仪的HDMI信号。

//抽象类  VGA接口
class VGA
{
public:
    virtual void play() = 0;
};
//VGA接口的投影仪
class TV1 : public VGA
{
public:
    void play()
    {
        cout << "使用VGA接口的TV1播放视频" << endl;
    }
};
class Computer
{
public:
    void playvideo(VGA *vag)
    {
        vag->play();
    }
};

class HDMI
{
public:
    virtual void play() = 0;
};
class TV2 : public HDMI
{
public:
    void play()
    {
        cout << "使用HDMI接口的TV2播放视频" << endl;
    }
};

//将VGA可以转化为HDMI接口
class VGA2HDMI : public VGA
{
public:
    VGA2HDMI(HDMI *p) : _hd(p) {}
    //将VGA接口换换为HDMI接口
    void play()
    {
        _hd->play();
    }

private:
    HDMI *_hd;
};

int main()
{
    Computer c;
    //c.playvideo(new TV1());

    c.playvideo(new VGA2HDMI(new TV2()));
    return 0;
}
           
C++设计模式 | Adapter适配器模式

继续阅读