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

代码实现:

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

#include<iostream>
using namespace std;//实现接口类(原来的老接口)
class Interface{
public://因为接口类virtual void Charge(){cout<<"TypeC"<<endl;}};//待适配的类
class USB{
public://需要使用适配器进行转换,所以打印了USB Adaptervoid 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博客icon-default.png?t=N7T8https://zhaitianbao.blog.csdn.net/article/details/129406741

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue的异步操作,钩子函数,和Element组件

使用vue进行异步操作 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </…

【NumPy】关于numpy.zeros()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

XV4001KD汽车级应用的数字输出陀螺传感器

XV4001KD是一款专为汽车导航系统和远程信息处理而设计的数字输出陀螺传感器。采用SPI/I2C串行接口&#xff0c;具有高精度的16位的角速率输出和11位的温度输出功能&#xff0c;能够准确地测量车辆的运动状态和环境温度&#xff0c;为导航系统和信息处理提供可靠的数据支持。以及…

《二》MP3在线搜索所歌曲的实现

上一期我们大致实现了布局等操作 那么这一期我们来实现如何去搜索歌曲&#xff1a; 首先呢&#xff0c;我们是设计多媒体&#xff0c;要包含多媒体类头文件&#xff0c;还要能在线搜索&#xff0c;那就要包含网络上的头文件&#xff0c;还要实现打开文件操作&#xff0c;处理…

Pytorch DDP分布式细节分享

自动微分和autograde 自动微分 机器学习/深度学习关键部分之一&#xff1a;反向传播&#xff0c;通过计算微分更新参数值。 自动微分的精髓在于它发现了微分计算的本质&#xff1a;微分计算就是一系列有限的可微算子的组合。 自动微分以链式法则为基础&#xff0c;依据运算逻…

kubeadm部署k8s v1.28

一、主机准备 主机硬件配置说明 作用IP地址操作系统配置k8s-master01192.168.136.55openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node01192.168.136.56openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node02192.168.136.57openEuler-22.03-LTS-SP12颗CPU 4G内存 50G…

安全生产月答题pk小程序怎么做

在当今信息化时代&#xff0c;小程序已成为人们日常生活和工作中不可或缺的一部分。特别是在安全生产领域&#xff0c;通过小程序进行答题PK活动&#xff0c;不仅可以提高员工的安全意识&#xff0c;还能促进团队间的协作与交流。本文将详细介绍如何制作一款安全生产月答题PK小…

C语言实现贪吃蛇游戏

文章目录 前言一、蛇的结构的创建二、游戏测试的逻辑三、初始化游戏四、游戏运行五、游戏结束总结 前言 C语言实现贪吃蛇游戏 一、蛇的结构的创建 先创建一个蛇身的节点在创建蛇的结构&#xff08;包括&#xff1a;指向蛇头的指针&#xff0c;指向食物的指针&#xff0c;游戏…

初识DataX3.0

目前接到任务&#xff0c;让同步表数据。市面很多同步工具不一一尝试了&#xff0c;信赖阿里&#xff0c;所以调研了一下阿里的dataX,一点点来吧&#xff0c;学习为主 环境准备&#xff1a;linux6.8 python自带的2.7 MySQL 5.7.1 1.先下载&#xff1a; wget http://datax-o…

油猴脚本使用cookie一般是某请求返回的setcookie,一般不是js生成的,直接请求拼接

写完hook脚本 删除页面cooike&#xff0c;打开开发者模式&#xff0c;刷新页面 cookie一般是某请求返回的setcookie,一般不是js生成的&#xff0c;直接请求拼接带cookie请求 看网络里的cookie httponly打钩的是服务器返回的&#xff0c;但不一定对&#xff0c;还是要看保存日…

MPLS VPN

不是公司的产品&#xff0c;是运营商对外提供的一种服务 没咋懂&#xff0c;oh my god

安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错的原因排查

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

Milvus的执行引擎Knowhere

前言 本文将会介绍Knowhere这个概念&#xff0c;它是milvus向量执行引擎的核心。 概览 Knowhere是milvus向量咨询引擎的核心&#xff0c;它将好几个向量相似搜索库聚集在一起&#xff08;包括faiss、hnswlib、annoy&#xff09;。Knowhere也被设计支持异构计算。它控制在什么…

Java设计模式-观察者模式(19)

Java中的观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,这样一来,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式使得你可以独立地改变目标和观察者,让两者之间的耦合度降低。 基本组成部分 …

电商平台api接口:采购比价可用的比价工具推荐

电商平台api接口 目前&#xff0c;许多企业在进行内部采购时都有比价的需求。企业利用比价采购这一方式&#xff0c;能通过对比不同平台上、不同供应商的报价&#xff0c;进而选择最符合其需求和预算的产品或服务。 在比价采购的流程中&#xff0c;最重要的步骤就是企业在明确…

C#Csharp,SharpPcap网络抓包程序及源码(适合网络分析直接使用或源码二次开发)

目录 1.程序简介2.程序截图3.程序源码 1.程序简介 C#Csharp,SharpPcap网络抓包程序及源码&#xff08;适合网络分析直接使用或源码二次开发&#xff09; 2.程序截图 3.程序源码 https://download.csdn.net/download/xzzteach/89325817

Linux学习(十四)-- 软件安装:yum命令、apt命令

目录 1. yum命令&#xff1a;基于RPM的软件包管理器 2. apt命令&#xff1a;在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器 apt 常用命令 1. yum命令&#xff1a;基于RPM的软件包管理器 yum命令来自英文词组yellow dog updater modified的缩写。 其功能&#xff1a; 在L…

沃创云外呼系统——能够企业带来什么样的帮助

沃创云外呼系统是一款功能强大的呼叫系统&#xff0c;能够助力企业提升营销效率&#xff0c;实现业绩增长。以下是沃创云外呼系统具体可以为企业带来的帮助 01节约成本 沃创云外呼系统能够自动拨打海量客户电话号码&#xff0c;降低企业成本&#xff0c;提高工作效率。使用沃创…

1.golang背景、特点介绍

背景介绍 Go 是 Google 开发的一种编程语言。 它于 2009 年由 Robert Griesemer、Rob Pike 和 Ken Thompson 作为开源项目发布。 从那时起&#xff0c;Go 语言就被用于开发其他众所周知的技术&#xff0c;如 Docker、Kubernetes 和 Terraform。 尽管 Go 语言在服务器端和云软件…

EI会议论文的格式和模板在哪里可以找到?

要找到EI会议论文的格式和模板&#xff0c;首先访问会议的官方网站&#xff0c;这是最直接的途径。会议网站通常在下载中心或投稿指南中提供详细的模板和格式要求。此外&#xff0c;你也可以查阅会议通知邮件、合作出版社平台、往届会议论文&#xff0c;或者直接联系会议组织者…