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

文章目录

  • 一、前言
  • 二、对于接口的讨论
  • 三、实现
    • 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.mzph.cn/diannao/39658.shtml

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

相关文章

mapreduce实现bean的序列化与反序列化

目录 序列化&#xff08;Serialization&#xff09; 反序列化&#xff08;Deserialization&#xff09; 事例操作 UserSale 重写序列化方法 重写反序列化 重写toString方法 SaleMapper SaleReducer SaleDriver 序列化&#xff08;Serialization&#xff09; 序列化是将…

【后端面试题】【中间件】【NoSQL】MongoDB的配置服务器、复制机制、写入语义和面试准备

MongoDB的配置服务器 引入了分片机制之后&#xff0c;MongoDB启用了配置服务器(config server) 来存储元数据&#xff0c;这些元数据包括分片信息、权限控制信息&#xff0c;用来控制分布式锁。其中分片信息还会被负责执行查询mongos使用。 MongoDB的配置服务器有一个很大的优…

WPF----自定义滚动条ScrollViewer

滚动条是项目当中经常用到的一个控件&#xff0c;大部分对外项目都有外观的需求&#xff0c;因此需要自定义&#xff0c;文中主要是针对一段动态的状态数据进行展示&#xff0c;并保证数据始终在最新一条&#xff0c;就是需要滚动条滚动到底部。 1&#xff0c;xaml中引入 <…

zxing-cpp+OpenCV根据字符串生成条形码

编译构建 需要使用到 CMake、Git、GCC 或 MSVC。 github 链接&#xff1a;https://github.com/zxing-cpp/zxing-cpp 编译之前请确保&#xff1a; 确保安装了 CMake 版本 3.15 或更高版本。 确保安装了与 C17 兼容的编译器(最低VS 2019 16.8 / gcc 7 / clang 5)。 编译构建…

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

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

重写父类方法、创建单例对象 题目

题目 JAVA27 重写父类方法分析&#xff1a;代码&#xff1a; JAVA28 创建单例对象分析&#xff1a;代码&#xff1a; JAVA27 重写父类方法 描述 父类Base中定义了若干get方法&#xff0c;以及一个sum方法&#xff0c;sum方法是对一组数字的求和。请在子类 Sub 中重写 getX() 方…

AI智能体|AI打工我躺平!使用扣子Coze智能体自动生成和发布文章到微信公众号(一)

大家好&#xff0c;我是无界生长&#xff0c;国内最大AI付费社群“AI破局俱乐部”初创合伙人。这是我的第 44 篇原创文章——《AI智能体&#xff5c;AI打工我躺平&#xff01;使用扣子Coze智能体自动生成和发布文章到微信公众号&#xff08;一&#xff09;》 AI智能体&#xf…

《涅朵奇卡:一个女人的一生》读后感

这周的计划是看完海明威的《丧钟为谁而鸣》&#xff0c;但是因为下班晚&#xff0c;而且书的体量大&#xff0c;所以只看了一半。本来以为这周的阅读计划完不成了&#xff0c;不料昨天加完班后拿起新到的《涅朵奇卡&#xff1a;一个女人的一生》&#xff0c;不自觉就陷进去了&a…

端口聚合基础知识

一、什么是端口聚合 端口聚合是将多个物理端口捆绑在一起&#xff0c;形成一个逻辑链路&#xff0c;以实现带宽增加、提高冗余和负载均衡的技术。端口聚合&#xff0c;也称为以太通道&#xff08;Ethernet Channel&#xff09;&#xff0c;主要用于交换机之间的连接。在具有多…

开发数字药店APP实战:互联网医院系统源码详解

本篇文章&#xff0c;笔者将深入探讨如何开发一个功能完善的数字药店APP&#xff0c;并详细解析互联网医院系统的源码实现。 一、数字药店APP的需求分析 应具备以下基本功能&#xff1a; 用户注册与登录 药品搜索与浏览 在线下单与支付 订单管理 健康咨询与远程医疗 个人…

partition()方法——分割字符串为元组

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 partition()方法根据指定的分隔符将字符串进行分割。如果字符串中包含指定的分隔符&#xff0c;则返回一个3元的元组&#xff0c;第一个为…

Perl 语言开发(四):条件语句

目录 1. 概述 2. if 语句 3. else 语句 4. elsif 语句 5. unless 语句 6. 嵌套条件语句 7. 三元运算符 8. 智能匹配运算符 9. given-when 语句 10. 条件修饰符 11. 高级条件语句应用 11.1 数据验证 11.2 配置文件解析 11.3 异常处理 12. 条件语句的最佳实践 12…

Spring Boot+Mybatis Plus 使用Redis实现二级缓存具体步骤以及代码

下面是使用Spring BootMybatis Plus和Redis实现二级缓存的具体步骤和代码示例&#xff1a; 1. 首先&#xff0c;确保你已经添加了Spring Boot、Mybatis Plus和Redis的依赖。 2. 在Spring Boot的配置文件中添加Redis的配置&#xff0c;如下所示&#xff1a; yaml spring: r…

wordpress:更新网站域名后后页面无法访问,页面媒体文件异常(已解决)

WordPress 在数据库中存储了许多配置信息,包括网站的域名。如果更新了域名,但数据库中的旧域名没有更新,WordPress 将无法正确生成页面链接或重定向访问请求。 一、更新域名 在wp-config.php 文件中,添加或更新你的新域名! define(WP_HOME, http://172.18.214.195:32520…

Linux_fileio学习

参考韦东山老师教程&#xff1a;https://www.bilibili.com/video/BV1kk4y117Tu?p12 目录 1. 文件IO函数分类2. 函数原型2.1 系统调用接口2.2 标准IO接口 3. fileio内部机制3.1 系统调用接口内部流程3.1 dup函数使用3.2 dup2函数使用 4. open file4.1 open实例4.2 open函数分析…

Cocos如何跟Android通信?

点击上方亿元程序员+关注和★星标 引言 Cocos如何跟Android通信 大家好,相信小伙伴们通过阅读笔者前几期的文章**《Cocos打安卓包打不出来?看看这个》,对Cocos**如何打安卓包有了一定的了解。 但是,除了把安卓包打出来,另外还有一个重要的就是要能够调用安卓提供的Java方…

华为HCIP Datacom H12-821 卷21

1.单选题 以下关于PIM-SM中SPT切换的描述,错误的是哪一项? A、若所有组播流量都经过RP路由器,则RP路由器可能成为数据转发的瓶颈 B、SPT路径最短,转发性能更优 C、SPT 切换完成后,组播流量依然经过 ReT 树 D、RPT 树可能不是组播流量转发的最优路径 正确答案: C 解析…

【AI原理解析】—K近邻(KNN)原理

目录 一、算法概述 二、算法原理 1. 数据集准备 2. 输入新数据 3. 距离计算 4. 选择K个最近邻 5. 预测 三、关键要素 1. K值的选择 2. 距离度量方法 3. 数据预处理 四、算法优缺点 优点 缺点 五、总结 KNN&#xff08;K-Nearest Neighbors&#xff0c;K最近邻&a…

[教程]Gitee保姆级图文使用教程

我们在日常的工作过程中经常会遇到&#xff0c;家里和公司资料文件同步的问题&#xff0c;以及项目开发过程中的协作问题。Git就完美的解决了这些问题&#xff0c;但是由于 Git国外服务器的原因平时网络太慢了&#xff0c;不过还好有国内的托管平台Gitee&#xff08;码云&#…

「C++系列」C++ 变量类型

文章目录 一、C 变量类型1. 基本数据类型2. 复合数据类型3. 类型修饰符 二、C 变量定义案例 1: 基本类型变量的定义和初始化案例 2: 数组的定义和使用案例 3: 结构体&#xff08;Struct&#xff09;的定义和使用案例 4: 指针的定义和使用案例 5: 类的定义和使用&#xff08;面向…