《C++20设计模式》适配器模式经验分享

news2024/12/24 10:58:59

文章目录

  • 一、前言
  • 二、对于接口的讨论
  • 三、实现
    • 1、对象适配器
      • 1.1 UML类图
      • 1.2 实现
    • 2、类适配器
  • 四、最后

一、前言

从适配器模式开始就是类的组合聚合,类与类之间结构性的问题了。

  • 适配器模式解决的问题: 适配器模式能够在不破坏现有系统结构的情况下,使得不兼容的接口可以协同工作
    相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_modern_Cpp_20

二、对于接口的讨论

可能会有以下两种情况:

  1. 两个接口都有抽象父类
    请添加图片描述
  2. 没有抽象父类
    请添加图片描述
    不知道大家怎么样,我当时从网上看实现方案真是千奇百怪,当然现在才发现是有没有抽象父类的问题!🥸

哪这个影响嘛?🤔
答案嘛不影响。
知道适配器怎么加上的你就明白了!
适配器:是B_Base的子类,关联A(成员函数)

具体的A转化为B的接口,所以A有没有抽象都无所谓,最后适配器的工作是把具体的A转换成B_Base

三、实现

由于上面两种情况都一样,所以作者实现第二种,简单点。🫠

1、对象适配器

对象适配器通过组合被适配者对象来实现适配器模式,适配器类实现目标接口,并在内部持有一个被适配者对象的实例

优点:

  1. 灵活性: 对象适配器使用组合关系,因此可以适配多个不同的被适配者对象,且可以在运行时动态改变适配者对象。

缺点

  1. 更多的对象间交互: 可能会导致系统中对象数量增加,复杂度增加。

1.1 UML类图

请添加图片描述

1.2 实现

#include <iostream>
using namespace std;
class A {
    int a;
public:
    A(int a) : a(a) {}
    void show() {
        cout << "接口A:" << a << endl;
    }
};

class B_Base {
public:
    virtual void showB() = 0;
};

class B : public B_Base {
    int b;
public:
    void showB() {
        cout << "接口B:" << b << endl;
    }
};

class Adapter : public B_Base {
    A* a_instance;
public:
    Adapter(A* a_instance) : a_instance(a_instance) {}
    // 转换成:接口B包裹接口A的形式
    void showB() override {
        cout << "接口B:"; // 转换成 接口B 
        a_instance->show();
    }
};

int main() {
    A* a_instance = new A(5);
    Adapter* adapter = new Adapter(a_instance);
    adapter->showB();
    return 0;
}

2、类适配器

不推荐用这个。偶然间看到了,而且《C++20设计模式》中没有写这个。可能是缺点太明显了把!😑

缺点:

1.会出现二义性: 由于继承多个类,可能会出现二义性
2. 无法适配被适配者类的子类: 如果被适配者类有子类,且希望适配器也能适配这些子类,类适配器不太适合,因为它固定了适配器与被适配者类的继承关系。
3. 需求不灵活: 由于适配器与被适配者类的绑定关系是静态的,无法在运行时动态改变适配器的行为。

这里就不写了,困啦,而且也不常用。具体就是适配器同时继承接口A及接口B

四、最后

如有帮助,点个赞把!创作不易!!!😭

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

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

相关文章

震惊!张宇强化36讲1200页,暑期强化高效利用指南!

特别喜欢张宇老师的讲课风格 如果你打算跟张宇老师&#xff0c;那么基础——>强化——>冲刺&#xff0c;你应该这么买书&#xff01; 张宇老师25版课程大改版&#xff0c;其中&#xff0c;36讲的变动是最大的&#xff0c;张宇老师25版课程把以往的强化课程前移&#xff0…

Lumière:开创性的视频生成模型及其应用

视频内容创造领域迎来了突破性进展&#xff0c;但视频生成模型由于运动引入的复杂性而面临更多挑战。这些挑战主要源自运动的引入所带来的复杂性。时间连贯性是视频生成中的关键要素&#xff0c;模型必须确保视频中的运动在时间上是连贯和平滑的&#xff0c;避免出现不自然的跳…

法国工程师IMT联盟 密码学及其应用 2023年期末考试补考题

1 JAVA 安全 1.1 问题1 1.1.1 问题 用 2 或 3 句话解释 Java 执行模型&#xff08;Java 虚拟机machine virtuelle Java)&#xff09;中引入introduit沙箱bac sable机制 mcanisme d’excution par isolation的目的。 1.1.2 问题解释 在 Java 执行模型&#xff08;Java 虚拟机…

带电池监控功能的恒流直流负载组

EAK的交流和直流工业电池负载组测试仪对于测试和验证关键电力系统的能力至关重要&#xff0c;旨在实现最佳精度。作为一家客户至上的公司&#xff0c;我们继续尽我们所能应对供应链挑战&#xff0c;以提供出色的交货时间&#xff0c;大约是行业其他公司的一半。 交流负载组 我…

Python面试宝典第4题:环形链表

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。如果存在环 &#xff0c;则返回 true 。 否则&#xff0c;返回 false 。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xf…

基于多视点编码光场的全景三维重建方法

欢迎关注GZH《光场视觉》 摘要&#xff1a;在基于光场的一系列应用中&#xff0c;目标的三维重建是基础且关键的任务。普通光场只能重建单一视角而无法重建全景&#xff0c;并且在纹理特征匮乏的区域也无法生成准确的三维信息。针对以上问题&#xff0c;提出一种基于多视点编码…

端口被占用的解决办法、netstat命令;Linux ps命令详解,Linux查看进程

文章目录 一、端口被占用的原因二、端口被占用的解决方法2.1 Windows系统2.2 Linux系统 三、Linux命令补充3.1 Linux查看端口占用情况3.2 netstat命令详解3.3 ps命令3.3.1 常用命令3.3.2 拓展命令3.3.3 字段补充 运行软件或程序时&#xff0c;有时会出现以下问题、导致运行失败…

JavaScript中的立即执行函数表达式(Immediately Invoked Function Expression, IIFE)

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介JavaScript中的立即执行函数表达式&#xff08;Immediately Invoked Function Expression, IIFE&#xff09;1. 引言2. IIFE的概念2.1 概述2.2 语法2.3 历史背景 3. IIFE的作用3.1 创建独立作用域3.2 模块化代码3.3 防止变量提升3.…

我不小心把生产的数据改错了!同事帮我用MySQL的BinLog挽回了罚款

之前在生产做修改数据的时候不小心改错了一行数据&#xff0c;本来以为会被通报批评&#xff0c;但是同事利用binlog日志查看到了之前的旧数据&#xff0c;并且帮我回滚了&#xff0c;学到了&#xff0c;所以写了一篇binlog的文章分享给大家。 MySQL的Binary Log&#xff08;简…

CentOS 7 停止维护(2024-6-30)后可用在线yum源 —— 筑梦之路

众所周知&#xff0c;centos 7 在2024年6月30日&#xff0c;生命周期结束&#xff0c;官方不再进行支持维护&#xff0c;而很多环境一时之间无法完全更新替换操作系统&#xff0c;因此对于yum源还是需要的&#xff0c;特别是对于互联网环境来说&#xff0c;在线yum源使用方便很…

标注比赛一种计分方法

这段时间试着在公司内部举办一场图片标注大赛&#xff0c;我负责制定规则&#xff0c;挑选比赛素材。这几天试了一种得分计算方法&#xff0c;结果尚可。利用我司研发的标注工具&#xff0c;我们很容易就可以得出下图结果。 这个结果中的标注框其实就是标准答案&#xff0c;漏检…

面向物联网行业的异常监控追踪技术解决方案:技术革新与运维保障

在现代高度数字化和互联的环境中&#xff0c;物联网技术已经深入到我们生活的方方面面。特别是在家庭和工业环境中&#xff0c;物联网系列通讯作为连接各类设备的关键枢纽&#xff0c;其稳定性和可靠性显得尤为重要。本文将介绍一种创新的监控系统&#xff0c;旨在实时跟踪和分…

无人机基础知识(模式篇)

姿态模式&#xff1a;姿态模式通常是在GPS模式无法使用的情况下进行操作的模式。通过操作杆对无人机进行操控&#xff0c;姿态模式下无人机只能提供自稳&#xff0c;不提供定点悬停&#xff0c;受外界影响很大&#xff1b; GPS模式&#xff1a;GPS模式通俗一点就是依靠GPS将无…

电路笔记(PCB):电流容量(IPC-2221和IPC-2152)+阻抗匹配

电流容量 IPC-2221经验公式 I K T b A c IK\times T^{b}\times A^{c} IKTbAc 这个公式用于估计PCB&#xff08;Printed Circuit Board&#xff0c;印刷电路板&#xff09;导线上的电流&#xff08;I&#xff09;&#xff0c;其中T和A分别表示温度&#xff08;Temperature&a…

SQL语句(DDL)

关系型数据库&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库 SQL语句 DDL-数据库操作 DDL-表操作-查询 DDL-表操作-创建 创建一个名为tb_user的表 mysql> use itheim; Database changed mysql> create table tb_user(-> id …

Python基础入门知识

目录 引言 简要介绍Python语言 为什么要学习Python Python的应用领域 Python安装和环境配置 Python的下载和安装(Windows, macOS, Linux) 配置Python环境变量 安装和使用IDE(如PyCharm, VS Code) Python基本语法 注释 变量和数据类型(数字,字符串,列表,元组,字典,…

【CUDA】 由GPGPU控制核心架构考虑CUDA编程中线程块的分配

GPGPU架构特点 由于典型的GPGPU只有小的流缓存&#xff0c;因此一个存储器和纹理读取请求通常需要经历全局存储器的访问延迟加上互连和缓冲延迟&#xff0c;可能高达数百个时钟周期。与CPU通过巨大的工作集缓存而降低延迟不同&#xff0c;GPU硬件多线程提供了数以千计的并行独…

服务器数据恢复—raid5阵列硬盘出现大量坏道的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台DELL EqualLogic PS 4000存储中有一组由12块磁盘组建的raid5阵列&#xff0c;存储空间划分3个同等大小的卷&#xff0c;采用的VMFS文件系统。 两块硬盘指示灯亮黄色&#xff0c;raid5阵列崩溃&#xff0c;存储变得不可用。 服…

尝试修改苍穹外卖为”李小罗餐厅“

学习苍穹外卖后&#xff0c;将其修改为自己所需要的项目&#xff0c;也是对苍穹外卖项目的加深理解 对项目之间的连接等关系进一步清晰&#xff0c;那么便开始吧 d1_开始修改 修改名字为”李小罗餐厅“ src\views\login\index.vue src\router.ts 结果展示 修改进来之后的展示…

昇思25天学习打卡营第9天|MindSpore-Vision Transformer图像分类

Vision Transformer图像分类 Vision Transformer(ViT)简介 近些年,随着基于自注意(Self-Attention)结构的模型的发展,特别是Transformer模型的提出,极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩展性,它已经能够训练具有超过100B参数的空前…