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

适配器模式是一种设计模式,它允许不同接口的类协同工作。本文通过两个生动的例子,阐述了适配器模式的概念:一是电源适配器将220V电压转换为设备可用的电压;二是电脑通过信号转换器将VGA信号转换为HDMI信号以连接HDMI投影仪。通过代码实现展示了适配器模式在实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

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

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

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

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

模式结构图

代码实现

//目标接口类
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;
}

 具体的例子的代码实现

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

我们的电脑只支持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;
}

但是现在我们只有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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值