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

概念

适配器模式:将一个类的接口转化成客户希望的另外一个接口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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
适配器模式Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。它通常用于解决两个已有接口之间不兼容的问题。 在给出的代码示例,我们可以看到适配器模式的应用。在Main.cpp文件,创建了一个Target对象指针target,并将其初始化为Adapter对象。然后调用target的request()函数,实际上调用的是Adapter的request()函数。而Adapter的request()函数内部调用了Adaptee的specificRequest()函数,完成了适配的过程。 在Head.h文件定义了三个类:Target、Adaptee和Adapter。Target类是适配器模式的目标接口,定义了一个虚函数request()。Adaptee类是被适配的类,它有一个特殊的请求函数specificRequest()。Adapter类是适配器类,它继承了Target类,并在其request()函数调用了Adaptee类的specificRequest()函数。 通过适配器模式,我们可以将不兼容的两个接口进行适配,使它们能够协同工作。这在软件开发经常用于复用已有代码或集成多个系统。 参考: C++设计模式适配器模式Adapter Head.cpp Main.cpp<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++设计模式适配器模式(Adapter)](https://download.csdn.net/download/weixin_38666785/12761879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++设计模式-适配器模式](https://blog.csdn.net/qq78442761/article/details/95766831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值