C++设计模式|结构型 适配器模式

1.什么是适配器模式?

可以将⼀个类的接⼝转换成客户希望的另⼀个接⼝,主要⽬的是 充当两个不同接⼝之间的桥梁,使得原本接⼝不兼容的类能够⼀起⼯作。

2. 适配器模式的组成

(1)接口类,给客户端调用;(2)被适配者类;(3)适配器类。

3.适配器模式的分类

适配器模式一般分为类适配器模式和对象适配器模式。

(1)类适配器模式:适配器类通过继承适配者类(多重继承),达到适配目的,部分语言可能不支持多重继承(如C#)。

(2)对象适配器模式:适配器类中存放适配者类的实例对象,调用它来达到适配目的,该模式较常用。下面的题目我们使用第二种类型来进行求解。

下面我们看一下《大话设计模式》这本书对适配器模式的介绍与实现:

不难看出,适配器模式的适配器类Adapter继承了原始的客户接口Target,并且适配器类Adapter里面包含了一个待适配类的对象,重写接口中的虚函数,实际调用的是这个对象的功能函数。在使用适配器模式时,客户端调用的接口会从原来的target变成现在的Adapter.

4.c++实现适配器模式

题目描述

小明购买了一台新电脑,该电脑使用 TypeC 接口,他已经有了一个USB接口的充电器和数据线,为了确保新电脑可以使用现有的USB接口充电器和数据线,他购买了一个TypeC到USB的扩展坞。

请你使用适配器模式设计并实现这个扩展坞系统,确保小明的新电脑既可以通过扩展坞使用现有的USB接口充电线和数据线,也可以使用TypeC接口充电。

输入描述

题目包含多行输入,第一行输入一个数字 N (1 < N <= 20),表示后面有N组测试数据。

之后N行都是一个整数,1表示使用电脑本身的TypeC接口,2表示使用扩展坞的USB接口充电。

输出描述

根据每行输入,输出相应的充电信息。

输入示例

复制代码
3
1
2
1

输出示例

复制代码
TypeC
USB Adapter
TypeC

代码实现:

我们就按照大话设计模式介绍的过程来实现这些功能。代码如下:

cpp 复制代码
#include<iostream>
using namespace std;


//实现接口类(原来的老接口)
class Interface{
public:
    //因为接口类
    virtual void Charge(){
        cout<<"TypeC"<<endl;
    }
    
};

//待适配的类
class USB{
public:
    //需要使用适配器进行转换,所以打印了USB Adapter
    void USBCharge(){
        cout<<"USB Adapter"<<endl;
    }
    
};

//适配器类, 要继承老接口类
class Adapter: public Interface{
public:
    //要包含一个待适配的对象
    Adapter(){ this->usb = new USB(); }
    ~Adapter()
    { 
        if(this->usb != nullptr)
        {
            delete this->usb;
            this->usb = nullptr;
        } 
        
    }
    //多态完成转换
    virtual void Charge(){
        this->usb->USBCharge();
    }
private:   
    USB* usb ;
};

int main(){
    int N;
    cin>>N;
    //实际在使用适配者模式时,新的接口已经变成了适配器
    Adapter * newInterface = new Adapter();
    while(N--){
        int choice;
        cin>>choice;
        if(choice == 1){
            newInterface->Interface::Charge();
        }
        else if(choice == 2){
            newInterface->Charge();
        }
    }
    
    delete newInterface;
    
    return 0;
}

因为题目要求还要打印原来的TypeC,所以我在红框里使用了继承下来的原始充电方式。 而newInterface->Charge();这行代码就是还原的适配器模式了。

上述内容如有错误之处,还请各位小伙伴批评指正!此致,敬礼!!!

这里也推荐一篇很好的博文,将适配器模式讲的很清楚:

设计模式之适配器模式(C++)_c++ 设计模式适配器-CSDN博客https://zhaitianbao.blog.csdn.net/article/details/129406741

相关推荐
杨小码不BUG19 分钟前
蛇形舞动:矩阵填充的艺术与算法(洛谷P5731)
c++·算法·矩阵·csp-j/s·循环控制
草莓熊Lotso1 小时前
《C++ STL list 完全指南:从基础操作到特性对比,解锁链表容器高效用法》
开发语言·c++·list
繁星星繁2 小时前
C++11学习笔记
c++·笔记·学习
Stanford_11067 小时前
如何利用Python进行数据分析与可视化的具体操作指南
开发语言·c++·python·微信小程序·微信公众平台·twitter·微信开放平台
千里马-horse8 小时前
Async++ 源码分析8--partitioner.h
开发语言·c++·async++·partitioner
Lucis__9 小时前
再探类&对象——C++入门进阶
开发语言·c++
北京不会遇到西雅图10 小时前
【SLAM】【后端优化】不同优化方法对比
c++·机器人
jndingxin10 小时前
c++多线程(6)------ 条件变量
开发语言·c++
程序员莫小特11 小时前
老题新解|大整数加法
数据结构·c++·算法
洲覆12 小时前
C++ 模板、泛型与 auto 关键字
开发语言·数据结构·c++