C++设计模式之适配器模式

news2024/11/20 4:05:44

一、适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成另一个类所期望的接口,以便两个类能够协同工作。

适配器模式可以解决现有类接口与所需接口不匹配的问题,使得原本因接口不兼容而无法合作的类可以一起工作。

在C++中,适配器模式通常涉及以下几个角色:

  • 目标接口(Target Interface):定义了客户端代码期望的接口。
  • 适配者(Adaptee):存在的类或组件,其接口与目标接口不匹配。
  • 适配器(Adapter):实现了目标接口,并通过包装适配者的方式将其接口转换为目标接口。

主要应用在以下场景:

  • 新旧接口兼容软件版本升级,部分旧接口还在被使用。需要保留旧的接口,增加新接口,使两者兼容。
  • 第三方接口的适配在系统功能稳定的情况下,有第三方新的接口需求需要对接。
  • 统一多个类相同功能的接口,例如统一不同类型数据库的访问接口。

二、类适配器

以多继承方式实现。
在这里插入图片描述

  • Target: 客户端期望接口类
  • Adaptee: 实际需要的功能类
  • Adapter: 将接口类与功能类衔接的适配器类
  • Client: 客户端代码
// 目标接口(新系统的接口)
class Target {
public:
    virtual ~Target() = default;
    virtual void Request() = 0;
};

// 被适配的类(老系统的接口)
class Adaptee {
public:
    void SpecificRequest() {
        // 一些特殊的请求
        cout << "Specific Request of Adaptee!" << endl;
    }
};

// 类适配器
class Adapter : public Target, private Adaptee {
public:
    void Request() override {
        // 将目标接口转化为特殊的请求
        SpecificRequest();
    }
};

int main() {
    Target* target = new Adapter;
    target->Request(); // 输出: Specific Request of Adaptee!

    delete target;
    return 0;
}

三、对象适配器

在适配器类中,包装适配者(Adaptee)接口。
在这里插入图片描述

  • Target: 客户端期望接口类
  • Adaptee: 实际需要的功能类
  • Adapter: 将接口类与功能类衔接的适配器类
  • Client: 客户端代码
// 目标接口
class TargetInterface {
public:
    virtual void request() = 0;
};

// 适配者
class Adaptee {
public:
    void specificRequest() {
        // 执行适配者特定的操作
        // ...
    }
};

// 适配器
class Adapter : public TargetInterface {
private:
    Adaptee* adaptee;

public:
    Adapter(Adaptee* adaptee) : adaptee(adaptee) {}

    void request() override {
        // 调用适配者的特定方法
        adaptee->specificRequest();
    }
};

int main() {
    // 创建适配者对象
    Adaptee* adaptee = new Adaptee();

    // 创建适配器对象,将适配者对象传入
    TargetInterface* adapter = new Adapter(adaptee);

    // 调用目标接口方法,实际上会执行适配者的特定方法
    adapter->request();

    delete adapter;
    delete adaptee;

    return 0;
}

四、总结

类适配器模式使用继承来适配接口;
对象适配器模式通过将适配者对象作为适配器类的成员变量来实现适配;

无论是类适配器模式还是对象适配器模式,都可以实现接口适配的效果,选择哪种方式取决于具体的需求和设计考虑。

参考

  • C++设计模式 - 适配器模式

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

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

相关文章

JavaScript下载excel文件

文章目录 通过链接下载a标签下载方法注意 获取文件流请求体配置下载文件流 总结 通过链接下载 a标签 对于已知地址的目标文件&#xff0c;前端可以使用 a标签 来直接下载&#xff0c;使用a标签下载使用到两个属性 download&#xff1a;下载文件名href&#xff1a;目标文件下…

ORA-01174: DB_FILES be compatible RAC rolling fashion complete outage

How to change the DB_FILES parameter in RAC (Doc ID 1636681.1)​编辑To Bottom In this Document Goal Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 10.1.0.2 and later Oracle Database Cloud Schema Service - Version N/A and later Oracle…

【业务功能篇75】微服务项目环境搭建docker-mysql-redisSpringCloudAlibaba

项目环境准备 1.虚拟机环境 我们可以通过VMWare来安装&#xff0c;但是通过VMWare安装大家经常会碰到网络ip连接问题&#xff0c;为了减少额外的环境因素影响&#xff0c;Docker内容的讲解我们会通过VirtualBox结合Vagrant来安装虚拟机。 VirtualBox官网&#xff1a;https:/…

《热题101》链表篇

思路&#xff1a;之前有反转链表前n个值、以及反转指定区间的链表&#xff0c;所以这个我只想在这两个基础上实现。用左右指针来确定当前反转的区间&#xff0c;每次反转之前都检查一下当前区间是否足够k&#xff0c;即区间之后的节点cur&#xff0c;足够就可以反转&#xff0c…

【Flink】Flink架构及组件

我们学习大数据知识的时候&#xff0c;需要知道大数据组件如何安装以及架构组件&#xff0c;这将帮助我们更好的了解大数据组件 对于大数据Flink&#xff0c;架构图图下&#xff1a; 整个架构图有三种关键组件 1、Client&#xff1a;负责作业的提交。调用程序的 main 方法&am…

基于乌鸦算法优化的BP神经网络(预测应用) - 附代码

基于乌鸦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于乌鸦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.乌鸦优化BP神经网络2.1 BP神经网络参数设置2.2 乌鸦算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

Spring练习31---用户添加操作--添加数据到数据库,最终添加讲师,助教操作最终完毕

视频链接&#xff1a;16-Spring练习-用户添加操作-添加数据到数据库_哔哩哔哩_bilibili 104 1、当你点击提交时&#xff0c;form表单进行提交 2、这个名字必须跟你当前封装的属性名一样 3、要封装跟user的属性名一样&#xff0c;这样springMVc才能自动封装进去 4、提交时选择r…

Cyanine5-alkyne在无机纳米领域的应用-星戈瑞

​欢迎来到星戈瑞荧光stargraydye&#xff01;小编带您盘点&#xff1a; Cyanine5-alkyne在无机纳米领域也有着诸多的应用&#xff0c;主要体现在以下几个方面&#xff1a; **1. 纳米颗粒表面功能化&#xff1a;**Cyanine5-alkyne作为反应性的炔基官能团&#xff0c;可以与含有…

springboot之@Async异步定时任务自定义线程池

在应用中经常会遇到定时执行任务的需求&#xff0c;这时采用异步的方式开启一个定时任务&#xff0c;通常引用Async注解&#xff0c;但直接使用会有风险&#xff0c;当我们没有指定线程池时&#xff0c;会默认使用其Spring自带的 SimpleAsyncTaskExecutor 线程池&#xff0c;会…

Elasticsearch Split和shrink API

背景&#xff1a; 尝试解决如下问题&#xff1a;单分片存在过多文档&#xff0c;超过lucene限制 分析 1.一般为日志数据或者OLAP数据&#xff0c;直接删除索引重建 2.尝试保留索引&#xff0c;生成新索引 - 数据写入新索引&#xff0c;查询时候包含 old_index,new_index 3.…

一、数据库基础

数据库 一、数据库基础 1、一些概念 数据库&#xff1a;数据库&#xff08;DataBase &#xff0c;简称DB&#xff09;&#xff0c;就是信息的集合。数据库是由数据库管理系统管理的数据的集合&#xff1b;数据库管理系统&#xff1a;简称DBMS 。是一种操纵和管理数据库的大型…

听GPT 讲Prometheus源代码--tsdb

题图来自 Prometheus TSDB (Part 1): The Head Block[1] tsdb 目录在 Prometheus 项目中承担了实现时间序列数据库&#xff08;Time Series Database&#xff09;的功能。Prometheus 使用这个自定义的时间序列数据库来高效地存储和查询监控数据。 在 tsdb 目录下&#xff0c;有…

这所C9无歧视!专业课简单,平均130分!

一、学校及专业介绍 哈尔滨工业大学&#xff08;Harbin Institute of Technology&#xff0c;简称哈工大&#xff09;&#xff0c;是隶属于工业和信息化部的全国重点大学&#xff0c;位于哈尔滨市&#xff0c;九校联盟“C9”之一&#xff0c;位列国家“双一流”、“985工程”、…

连接未来 驱动创新|腾讯云 CODING DevOps 主题沙龙诚邀您的参与

点击链接了解详情 随着企业数字化转型步入深水区&#xff0c;DevOps 作为数字化转型关键的内建阶段&#xff0c;其应用和实施已经成为企业提升研发效率&#xff0c;实现快速迭代和持续交付的重要手段。然而如何有效地实施 DevOps&#xff0c;如何利用 DevOps 推动业务发展和创新…

Wireshark数据抓包分析之UDP协议

一、实验目的&#xff1a; 通过使用wireshark对UDP数据包的抓取分析UDP协议的内容 二、预备知识&#xff1a; UDP协议的概念&#xff1a;UDP使用底层的互联网协议来传送报文&#xff0c;同IP一样提供不可靠的无连接传输服务。它也不提供报文到达确认、排序及流量控制等功能。 …

kafka复习:(4)为什么默认情况下相同的key不为空的消息会被存储到相同的分区

默认分区器DefaultPartitioner的分区代码&#xff1a; 可以看到&#xff0c;消息最终落在哪个分区就是由总计有几个分区以及key的值来决定的。

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks [2022 CVPR]

长期以来&#xff0c;仅使用单视角二维照片集无监督生成高质量多视角一致图像和三维形状一直是一项挑战。现有的三维 GAN 要么计算密集&#xff0c;要么做出的近似值与三维不一致&#xff1b;前者限制了生成图像的质量和分辨率&#xff0c;后者则对多视角一致性和形状质量产生不…

推荐这11个平面设计软件,平面设计师必备好物

今天本文整理了大厂设计师都在用的平面设计软件&#xff0c;为设计师的平面设计工作高效赋能&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是国内很多设计师或者设计团队都在用的平面设计软件&#xff0c;它能为个人设计师带来丰富的创作力和多样的平面设计功能…

UE学习记录03----UE5.2 使用拖拽生成模型

0.创建蓝图控件&#xff0c;自己想要展示的样子 1.侦测鼠标拖动 2.创建拖动操作 3.拖动结束时生成模型 3.1创建actor , 创建变量EntityMesh设为可编辑 生成Actor&#xff0c;创建变量EntityMesh设为可编辑 屏幕鼠标位置转化为3D场景位置 4.将texture设置为变量并设为可编辑&am…

ssm网上医院预约挂号系统源码和论文

ssm网上医院预约挂号系统源码和论文051 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 如今的信息时代&#xff0c;对信息的共享性&#xff0c;信息的流通性有着较高要求&#xff0c;因此传统管理方式…