当前位置: 首页 > news >正文

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

相关文章:

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

1.什么是适配器模式&#xff1f; 可以将⼀个类的接⼝转换成客户希望的另⼀个接⼝&#xff0c;主要⽬的是 充当两个不同接⼝之间的桥梁&#xff0c;使得原本接⼝不兼容的类能够⼀起⼯作。 2. 适配器模式的组成 &#xff08;1&#xff09;接口类&#xff0c;给客户端调用&…...

视频码流分析工具

一、VQ Analyzer 在线使用说明&#xff1a; https://vicuesoft.com/vq-analyzer/userguide/ ref&#xff1a; Video Analyzer and Streaming Tester Software – VQ Analyzer HEVC 分析工具 - 懒人李冰 推荐一个开源且跨平台的免费码流分析软件YUView - 知乎...

记一次重定向问题(浏览器安全)解决

近期做单点登陆功能&#xff0c;本身应该是一个很简单的功能&#xff0c;却发生了意向不到的问题…让我们看下&#xff1a; 首先第三方给出的地址需要通过JWT框架获取token拼接后跳转&#xff0c;我这边为了方便首选肯定是考虑用response.sendRedirect(url)&#xff0c;但是做好…...

【传知代码】transformer-论文复现

文章目录 概述原理介绍模型架构 核心逻辑嵌入表示层注意力层前馈层残差连接和层归一化编码器和解码器结构 数据处理和模型训练环境配置小结 本文涉及的源码可从transforme该文章下方附件获取 概述 Transformer模型是由谷歌在2017年提出并首先应用于机器翻译的神经网络模型结构…...

大模型日报|今日必读的 13 篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.MIT新研究&#xff1a;并非所有语言模型特征都是线性的 最近的研究提出了线性表征假说&#xff1a;语言模型通过操作激活空间中概念&#xff08;“特征”&#xff09;的一维表征来执行计算。与此相反&#xff0c;来…...

Python 魂斗罗的音效和动漫效果

一、实现游戏音效 音效是游戏中不可或缺的一部分&#xff0c;它可以为游戏增添氛围和趣味性。在 Pygame 中&#xff0c;我们可以使用 pygame.mixer 模块来播放音效。下面是一个简单的示例代码&#xff0c;演示如何在游戏中播放音效&#xff1a; import pygamepygame.mixer.init…...

Raylib 绘制自定义字体的一种套路

Raylib 绘制自定义字体是真的难搞。我的需求是程序可以加载多种自定义字体&#xff0c;英文中文的都有。 我调试了很久成功了&#xff01; 很有用的参考&#xff0c;建议先看一遍&#xff1a; 瞿华&#xff1a;raylib绘制中文内容 个人笔记&#xff5c;Raylib 的字体使用 - …...

C++学习笔记(21)——继承

目录 1. 继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承关系和访问限定符1.2.3 继承基类成员访问方式的变化 继承的概念总结&#xff1a; 2. 基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数知识点&#xff1a;派生类中6个默认成员函数…...

DOS学习-目录与文件应用操作经典案例-more

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 DOS系统的more命令是一个用于查看文本文件内容的工具。…...

android 在 Activity 的 onCreate 中获取View 的宽高

view 的 post 执行时&#xff0c;首先会判断view 的 mAttatchInfo 是否为空&#xff0c;如果不为空&#xff0c;则将Runnable 添加到mAttachInfo.handler 的 UI线程MessageQueue 中&#xff1b;如果为空&#xff0c;则先将Runnable 暂存在view 的类为HandlerActionQueue的mRunQ…...

Pod进阶——资源限制以及探针检查

目录 一、资源限制 1、资源限制定义&#xff1a; 2、资源限制request和limit资源约束 3、Pod和容器的资源请求和限制 4、官方文档示例 5、CPU资源单位 6、内存资源单位 7、资源限制实例 ①编写yaml资源配置清单 ②释放内存&#xff08;node节点&#xff0c;以node01为…...

XSS---DOM破坏

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.什么是DOM破坏 在HTML中&#xff0c;如果使用一些特定的属性名&#xff08;如id或name&#xff09;给DOM元素命名&#xff0c;这些属性会在全局作用域中创建同名的全局变量&#xff0c;指向对…...

2024电工杯数学建模B 题:大学生平衡膳食食谱的优化设计

背景&#xff1a; 大学时代是学知识长身体的重要阶段&#xff0c; 同时也是良好饮食习惯形成的重要时期。这一特 定年龄段的年轻人&#xff0c; 不仅身体发育需要有充足的能量和各种营养素&#xff0c; 而且繁重的脑力劳动和 较大量的体育锻炼也需要消耗大量的能源物质。 大学生…...

LeetCode 1542.找出最长的超赞子字符串:前缀异或和(位运算)

【LetMeFly】1542.找出最长的超赞子字符串&#xff1a;前缀异或和&#xff08;位运算&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-longest-awesome-substring/ 给你一个字符串 s 。请返回 s 中最长的 超赞子字符串 的长度。 「超赞子字符串」需…...

LLM企业应用落地场景中的问题概览

三个问题 AI思维快速工具:需要对接LLM的API、控制幻觉、管理知识库。POC验证四个难点 私有化部署的环境:包括网络和服务器环境。交互友好意想不到的情况方向选择:让客户做目标和方向的选择问题 一、RAG 多跳问题 通常发生在报告编写的数据整理环节,比如要从一堆报表中找…...

基于灰狼优化算法优化支持向量机(GWO-SVM)时序预测

代码原理及流程 基于灰狼优化算法优化支持向量机&#xff08;GWO-SVM&#xff09;的时序预测代码的原理和流程如下&#xff1a; 1. **数据准备**&#xff1a;准备时序预测的数据集&#xff0c;将数据集按照时间顺序划分为训练集和测试集。 2. **初始化灰狼群体和SVM模型参数…...

C++中获取int最大与最小值

不知道大家有没有遇到过这种要求&#xff1a;“返回值必须是int&#xff0c;如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] &#xff0c;需要截断这个整数&#xff0c;使其保持在这个范围内。例如&#xff0c;小于 −2^31 的整数应该被固定为 −2^31 &#xff0c;大…...

学习通高分免费刷课实操教程

文章目录 概要整体架构流程详细步骤云上全平台登录步骤小结 概要 我之前提到过一个通过浏览器的三个脚本就可以免费高分刷课的文章&#xff0c;由于不方便拍视频进行实操演示&#xff0c;然后写下了这个实操教程&#xff0c;之前的三个脚本划到文章末尾 整体架构流程 整体大…...

缓存降级

当Redis缓存出现问题或者无法正常工作时,需要有一种应对措施,避免直接访问数据库而导致整个系统瘫痪。缓存降级就是这样一种机制。 主要的缓存降级策略包括: 本地缓存降级 当Redis缓存不可用时,可以先尝试使用本地进程内缓存,如Guava Cache或Caffeine等。这样可以减少对Redis…...

PyQt6--Python桌面开发(32.QMenuBar菜单栏控件)

QMenuBar菜单栏控件 选择Main Window...

golang创建式设计模式---工厂模式

创建式设计模式—工厂模式 目录导航 创建式设计模式---工厂模式1)什么是工厂模式2)使用场景3)实现方式4)实践案例5)优缺点分析 1)什么是工厂模式 工厂模式(Factory Method Pattern)是一种设计模式&#xff0c;旨在创建对象时&#xff0c;将对象的创建与使用进行分离。通过定义…...

高精度定位平板主要应用在哪些领域

高精度定位平板是一种集成了高精度定位技术和强大计算能力的设备&#xff0c;能够提供亚米级甚至厘米级的定位精度。其应用领域广泛&#xff0c;涵盖测绘、精准农业、工程建设、地理信息系统&#xff08;GIS&#xff09;、公共安全等多个方面。这种设备凭借其高精度和耐用性&am…...

conda使用常用命令

Conda是一个非常常用的Python包管理器&#xff0c;也是Anaconda Python发行版的一部分。它可以帮助用户安装、更新、卸载Python包&#xff0c;以及管理Python虚拟环境。在这篇博客中&#xff0c;我们将总结一些常用的Conda命令及其用法。 安装和更新Conda 在使用Conda之前&…...

22-LINUX--多线程and多进程TCP连接

一.TCP连接基础知识 1.套接字 所谓套接字(Socket)&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程…...

像素级创意:深入浅出PixelCNN图像合成技术

参考 https://arxiv.org/pdf/1601.06759 https://blog.csdn.net/zcyzcyjava/article/details/126559327 需要熟悉熵的一些理论、和极大释然估计等价于最小化交叉熵等知识 1. pixelcnn建模方法 pixelcnn做生成模型的想必都有耳闻。它是一种自回归模型&#xff0c;什么是自回归…...

MyBatisPlus使用流程

引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4</version> </dependency> 版本号根据需要选取 在实体类上加注解声明&#xff0c;表信息 根据数…...

爬虫技术升级:如何结合DrissionPage和Auth代理插件实现数据采集

背景/引言 在大数据时代&#xff0c;网络爬虫技术已经成为数据收集的重要手段之一。爬虫技术可以自动化地从互联网上收集数据&#xff0c;节省大量人力和时间成本。然而&#xff0c;当使用需要身份验证的代理服务器时&#xff0c;许多现有的爬虫框架并不直接支持代理认证。这就…...

go 微服务框架kratos错误处理的使用方法及原理探究

通过go语言原生http中响应错误的实现方法&#xff0c;逐步了解和使用微服务框架 kratos 的错误处理方式&#xff0c;以及探究其实现原理。 一、go原生http响应错误信息的处理方法 处理方法&#xff1a; ①定义返回错误信息的结构体 ErrorResponse // 定义http返回错误信息的…...

AI播客下载:Dwarkesh Podcast(关于AI的深度访谈)

Dwarkesh Podcast 是由 Dwarkesh Patel 主持的播客&#xff0c;专注于深度访谈和探讨各种复杂且有趣的话题。该播客在业界获得了极高的评价&#xff0c;被认为是对话和思想交流的平台。 Dwarkesh Podcast 的内容涵盖了多个领域&#xff0c;包括经济学、哲学以及科技等。例如&am…...

C++11function包装器的使用

类模板std::function是一种通用、多态的函数包装。std::function的实例可以对任何可以调用的目标实体进行存储、 复制和调用操作。这些目标实体包括普通函数、Lambda表达式、函数指针、以及其他函数对象等。std::function对象是对 C中现有的可调用实体的一种类型安全的包裹&…...