C++如何实现适配器模式(Adapter Pattern)_C++设计模式与适配器实现

适配器模式解决接口不兼容问题,通过类适配器(多重继承)或对象适配器(组合)实现,推荐使用对象适配器以避免多重继承复杂性,常用于封装第三方库或旧系统集成。

c++如何实现适配器模式(adapter pattern)_c++设计模式与适配器实现

适配器模式用于解决接口不兼容的问题,让原本无法协同工作的类可以一起工作。在C++中,适配器模式通常通过继承或组合的方式实现,分为“类适配器”和“对象适配器”两种形式。

类适配器(通过多重继承)

类适配器利用C++的多重继承机制,同时继承目标接口和被适配类,从而将被适配类的接口转换为目标期望的接口。

适用场景:当被适配类的方法可以直接通过继承访问时使用。

定义一个目标接口(Target),声明客户端使用的接口。创建一个被适配类(Adaptee),其接口与目标不兼容。定义适配器类(Adapter),继承自 Target 和 Adaptee,并重写目标方法,调用 Adaptee 的对应功能。

示例代码:

立即学习“C++免费学习笔记(深入)”;

class Target {public:    virtual ~Target() = default;    virtual void request() {        std::cout << "Target: 标准请求n";    }};

class Adaptee {public:void specificRequest() {std::cout << "Adaptee: 特有请求n";}};

class ClassAdapter : public Target, private Adaptee {public:void request() override {specificRequest(); // 调用被适配类的方法}};

对象适配器(通过组合)

对象适配器不使用继承,而是在适配器内部持有被适配类的实例,更符合“合成复用原则”,推荐在大多数情况下使用。

适配器类包含一个指向 Adaptee 的指针或引用。通过委托方式调用 Adaptee 的方法。避免了继承带来的耦合问题,支持适配子类对象。

示例代码:

立即学习“C++免费学习笔记(深入)”;

class ObjectAdapter : public Target {private:    Adaptee* adaptee;  // 持有被适配对象public:    explicit ObjectAdapter(Adaptee* a) : adaptee(a) {}
void request() override {    std::cout < ";    adaptee->specificRequest();}

};

实际使用示例

客户端只依赖 Target 接口,无论背后是真实目标还是适配后的类。

void clientCode(Target* target) {    target->request();}

int main() {Target* t1 = new Target;clientCode(t1);

Target* t2 = new ClassAdapter;clientCode(t2);Adaptee* adaptee = new Adaptee;Target* t3 = new ObjectAdapter(adaptee);clientCode(t3);delete t1; delete t2; delete t3; delete adaptee;return 0;

}

输出结果:

Adaptee: 特有请求 ObjectAdapter: 转换为标准接口 -> Adaptee: 特有请求

适配器模式的关键点

适配器模式的核心是“转换接口”。它不改变原有行为,只是包装使其可用。

目标(Target):客户端期望的接口。被适配者(Adaptee):已有接口,但不符合客户端需求。适配器(Adapter):协调两者,实现目标接口的同时调用被适配者的功能。

基本上就这些。适配器模式在封装第三方库、旧系统集成时非常实用,能有效隔离变化,提升代码复用性。C++中优先推荐对象适配器,避免多重继承带来的复杂性。

以上就是C++如何实现适配器模式(Adapter Pattern)_C++设计模式与适配器实现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1482879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++中的this指针是什么_C++对象指针的原理与常见用法
上一篇 2025年12月19日 06:46:14
c++怎么使用互斥锁mutex保护共享数据_c++ mutex互斥锁保护多线程共享数据
下一篇 2025年12月19日 06:46:27

相关推荐

  • Apertus— 瑞士开源的首个大规模语言模型

    Apertus— 瑞士开源的首个大规模语言模型Apertus— 瑞士开源的首个大规模语言模型Apertus— 瑞士开源的首个大规模语言模型Apertus— 瑞士开源的首个大规模语言模型

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 天工大模型 中国首个对标ChatGPT的双千亿级大语言模型 115 查看详情 Apertus是什么 apertus是瑞士epfl、eth zurich和瑞士国家超级计算中心(cscs)联合推出的…

    2026年9月4日 用户投稿
    100
  • B站接入千问3,618期间商单成交效率提升5倍以上

    记者了解到,b站已经接入阿里巴巴的通义千问3(简称“千问3”)及其视觉语言模型vl等大模型,用于构建数据洞察智能体insightagent,旨在提升“花火”和“必达”等商业平台的工作效率。据悉,在618购物节期间,花火平台的商单成交效率提升了5倍以上,而必达的数据分析效率则提高了3倍以上。 作为B站…

    2026年9月4日
    100
  • Java远程调试(Remote Debugging)的那些事

    前言本文将探讨如何处理和调试那些仅在生产环境(或其他远程环境)中发生,而本地开发环境无法重现的“问题”。任何遇到这种情况的人都必须承认,试图找出这种“问题”原因的过程,很可能以一堆无根据的猜测告终:这是一个非常耗时且效率低下的过程。 还有一种情况,你得到了一个可以部署的war/jar包,只有clas…

    2026年9月4日
    000
  • AI for Science:北大、东方理工等团队用人工智能在实验数据中挖掘潜在规律

    AI for Science:北大、东方理工等团队用人工智能在实验数据中挖掘潜在规律AI for Science:北大、东方理工等团队用人工智能在实验数据中挖掘潜在规律AI for Science:北大、东方理工等团队用人工智能在实验数据中挖掘潜在规律AI for Science:北大、东方理工等团队用人工智能在实验数据中挖掘潜在规律

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 编辑 | ScienceAI‍‍ 科学研究的核心之一是发现能够描述自然现象的规律性方程。这些方程不仅能加深我们对自然的理解,还能为复杂问题的解决提供明确指导。 然而,许多领域,尤其是材料和化学等…

    2026年9月4日 用户投稿
    000
  • Maven pom.xml 中的资源配置:如何有效管理JAR包中的资源文件?

    Maven项目中pom.xml资源配置的最佳实践 在Maven构建过程中,pom.xml文件中的元素扮演着至关重要的角色,它负责将项目资源文件打包到最终的JAR包中。虽然Maven默认会包含一些特定目录下的资源,但显式配置元素仍然是最佳实践,这主要出于以下几个原因: 1. 明确指定资源目录: 通过元…

    2026年9月4日
    100
  • 告别繁琐的字符串处理:使用 Composer 简化你的 PHP 项目

    最近我负责一个 laravel 项目,需要处理用户提交的数据,其中包含各种非 ascii 字符,例如中文、日文、特殊符号等等。这些字符导致我的程序在进行字符串操作时效率低下,并且容易出现编码错误。我尝试了多种方法,例如使用 mb_string 函数,但效果并不理想,代码也变得冗长且难以维护。 为了解…

    用户投稿 2026年9月4日
    000
  • Beego框架提示“’GetSysStatus’方法不存在”错误如何解决?

    Beego框架报错:“’GetSysStatus’方法不存在”的排查与修复 在使用Beego框架进行开发时,如果遇到“’GetSysStatus’ method doesn’t exist”错误,通常表示你的代码中缺少名为GetSysSta…

    2026年9月4日
    000
  • Altman:OpenAI无意控告DeepSeek

    openai ceo sam altman否认了起诉中国初创公司deepseek的计划,尽管deepseek被指控“蒸馏”openai的技术。altman表示,openai将专注于持续开发领先的ai模型,而不是诉讼。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSe…

    2026年9月4日
    000
  • 《失落星船:马拉松》宣布延期发售 需更多时间准备

    射击游戏《失落星船:马拉松》原计划于今年9月24日正式上线,但bungie近日宣布该游戏将延期发布,新的发售时间将在今年秋季晚些时候公布。官方表示希望利用更多时间,将《马拉松》打造成真正能回应玩家期待的精品。 官方发表声明称:“我们通过社交媒体收到了大量反馈,这些声音对我们非常重要。我们也意识到,《…

    2026年9月4日
    200
  • .NET Framework怎么下载安装 图文详解

    .NET Framework怎么下载安装 图文详解.NET Framework怎么下载安装 图文详解.NET Framework怎么下载安装 图文详解.NET Framework怎么下载安装 图文详解

    在现代windows操作系统中,不少应用程序依然需要 .net framework 才能正常运行,尤其是一些虽然年代较久但仍被大量使用的软件。本文将全面介绍如何下载并安装 .net framework,帮助用户快速获取所需组件。 一、.NET Framework 简介 .NET Framework …

    2026年9月4日 用户投稿
    700
  • 英特尔大师挑战赛第一赛季圆满收官:全民电竞时代的新标杆

    英特尔大师挑战赛第一赛季圆满收官:全民电竞时代的新标杆英特尔大师挑战赛第一赛季圆满收官:全民电竞时代的新标杆英特尔大师挑战赛第一赛季圆满收官:全民电竞时代的新标杆英特尔大师挑战赛第一赛季圆满收官:全民电竞时代的新标杆

    随着《永劫无间》最后一场决胜局的画面在大赛屏幕上定格,英特尔大师挑战赛(IMC)第一赛季以一场堪称电竞里程碑式的巅峰对决圆满落下帷幕。今年赛事延续了网咖赛-大区赛-总决赛的三层晋级机制,同时为了提升公平性和观赏性,新增“双败淘汰制”与“天选之人积分制”,让更多因失误落败的强队有机会重返赛场。此外,决…

    2026年9月4日 用户投稿
    100
  • 免费PPT生成支持动画吗_免费工具实现PPT动画的技巧

    免费PPT工具可通过AI自动生成动画、手动设置或导出为GIF实现生动效果。1、使用Gamma.app或Canva等在线平台,输入描述语自动生成带动画的幻灯片;2、在LibreOffice Impress中通过“自定义动画”功能精细控制进入、强调与退出效果;3、将Google Slides等工具制作的…

    2026年9月4日
    100
  • C++中如何实现私有函数仅供特定公有函数调用?

    C++:限制私有函数的访问权限 如何确保C++中的私有成员函数只能被特定的公有成员函数访问,而其他函数无法直接调用? 在C++中,这可以通过巧妙地利用类的成员函数和作用域来实现。 私有成员函数本身就具有私有访问权限,这意味着只有类内部的成员函数才能访问它。 要实现“特定公有函数”的访问限制,我们不需…

    2026年9月4日
    000
  • 三六零与青岛市人民政府签署战略合作协议 推动大模型落地应用

    近日,青岛市人民政府与三六零数字安全科技集团有限公司(以下简称360公司)在青岛正式签署战略合作协议。双方将在共建青岛城市数字安全运营中心、推动城市应用大模型发展、加强网络安全建设、人才培养及生态合作等方面展开深入协作。青岛市人民政府市委副书记、市长任刚、360集团创始人周鸿祎等出席签约仪式并见证这…

    2026年9月4日
    100
  • 多家车企开始在美部署充电网 包括现代宝马本田奔驰

      近日,韩国现代汽车宣布,其与宝马、通用、本田、奔驰、斯特兰蒂斯、丰田等全球汽车巨头共同成立的电动汽车充电合资企业“ionna”已在美国北卡罗来纳州的达勒姆总部举行开业仪式,标志着ionna正式开始在全美范围内部署充电网络。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 D…

    2026年9月4日
    100
  • 龙旗科技:智能手机ODM业务稳健增长,加速布局AI智能硬件新赛道

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 2024年集成电路行业发展综述及龙旗科技的2025展望 2024年,集成电路行业在全球经济新常态、技术革新加速和市场需求变化的背景下持续发展。为深入了解行业发展趋势,《集微网》特别推出“展望20…

    2026年9月4日
    000
  • 告别用户名登录烦恼:使用cylancer/loginviaemail扩展TYPO3登录

    最近在维护一个基于typo3的网站时,遇到一个用户反馈的问题:他们更习惯使用邮箱地址登录,而非用户名。typo3默认的前端用户登录功能只支持用户名登录,这给一些用户带来了不便,特别是那些记不住用户名却记得邮箱地址的用户。这个问题虽然看似小,但影响着用户体验,需要一个有效的解决方案。 一开始,我考虑修…

    用户投稿 2026年9月4日
    200
  • deepseek、chatgpt两者哪个更好用?用哪些实际性的区别?

    DeepSeek 和 ChatGPT 作为先进语言模型,在自然语言处理上有着不同的差异。DeepSeek 拥有海量训练数据和庞大模型,专注于代码理解与生成,而在对话、问答等任务上,ChatGPT 凭借其泛用性更胜一筹。其优势分别体现在代码理解和自然文本生成上,适用于不同的领域和场景。 ☞☞☞AI 智…

    2026年9月4日
    000
  • Hibernate更新数据时,先删后插如何避免间歇性插入失败?

    Hibernate数据更新:避免先删后插的间歇性失败 使用Hibernate更新数据时,如果采用先删除现有记录再插入新数据的策略,可能会出现间歇性插入失败的情况。这是因为数据库操作并非原子性操作,在删除和插入之间存在时间窗口,可能导致并发问题或其他异常。 为了解决这个问题,建议在插入操作前强制Hib…

    2026年9月4日
    200
  • chatgpt搜索功能怎么使用?chatgpt免费搜索功能使用方法

    在当今数字时代,信息获取变得至关重要。ChatGPT,一种先进的人工智能语言模型,已成为寻找信息的一个有力工具。它提供了一个免费的搜索功能,让用户能够快速轻松地获取准确可靠的信息。本文将逐步指导您如何使用 ChatGPT 的搜索功能,充分利用这一强大的资源来扩展您的知识并解决您的问题。 ☞☞☞AI …

    2026年9月4日
    100

发表回复

登录后才能评论
关注微信