完整教程:C++设计模式之结构型模式:适配器模式(Adapter)

news/2025/10/1 9:04:43/文章来源:https://www.cnblogs.com/lxjshuju/p/19122093

适配器模式(Adapter)是结构型设计模式的一种,它的核心作用是将一个类的接口转换成客户端期望的另一个接口,使原本因接口不兼容而无法协作的类能够一起工作。这种模式类似于现实生活中的“转换器”(如电源适配器、USB转接头)。

一、核心角色与设计思想

适配器模式通过以下3个核心角色实现接口转换:

角色名称核心职责
目标接口(Target)客户端期望的接口,定义了客户端可以使用的方法。
适配者(Adaptee)已存在的、但接口与目标接口不兼容的类(需要被适配的类)。
适配器(Adapter)实现目标接口,并内部包含适配者的实例,通过转换调用适配者的方法,完成接口适配。

核心思想:不修改现有类(适配者)和客户端代码,通过引入适配器类,将适配者的接口转换为目标接口,实现两者的兼容。

二、实现方式

适配器模式有两种主要实现方式,根据适配器与适配者的关系不同区分:

1. 类适配器(继承实现)

适配器通过继承适配者类实现目标接口,将适配者的方法转换为目标接口方法。

#include <iostream>#include <string>// 1. 目标接口(客户端期望的接口)class Target {public:virtual void request(const std::string& data) const = 0;virtual ~Target() = default;};// 2. 适配者(已存在的、接口不兼容的类)class Adaptee {public:// 适配者的方法与目标接口方法名/参数不同void specificRequest(const std::string& data, int format) const {std::cout << "适配者处理数据:" << data<< "(格式:" << format << ")" << std::endl;}};// 3. 类适配器(继承适配者 + 实现目标接口)class ClassAdapter : public Target, private Adaptee {public:// 实现目标接口方法,内部调用适配者的方法void request(const std::string& data) const override {// 转换参数并调用适配者的specificRequestspecificRequest(data, 1); // 假设格式1是客户端需要的格式}};// 客户端代码:只依赖目标接口void clientCode(const Target* target) {target->request("测试数据");}int main() {std::cout << "直接使用适配者(接口不兼容,无法调用)" << std::endl;// Adaptee adaptee;// adaptee.request("数据"); // 编译错误:Adaptee没有request方法std::cout << "\n使用类适配器:" << std::endl;Target* adapter = new ClassAdapter();clientCode(adapter); // 客户端通过适配器调用适配者delete adapter;return 0;}
2. 对象适配器(组合实现)

适配器通过实现目标接口组合适配者对象(而非继承),完成接口转换。这是更常用的实现方式,符合“组合优于继承”原则。

#include <iostream>#include <string>// 1. 目标接口(与类适配器相同)class Target {public:virtual void request(const std::string& data) const = 0;virtual ~Target() = default;};// 2. 适配者(与类适配器相同)class Adaptee {public:void specificRequest(const std::string& data, int format) const {std::cout << "适配者处理数据:" << data<< "(格式:" << format << ")" << std::endl;}};// 3. 对象适配器(实现目标接口 + 组合适配者对象)class ObjectAdapter : public Target {private:Adaptee* adaptee; // 持有适配者对象的指针(组合关系)public:// 构造函数接收适配者对象ObjectAdapter(Adaptee* a) : adaptee(a) {}// 实现目标接口方法,通过适配者对象调用其方法void request(const std::string& data) const override {if (adaptee) {adaptee->specificRequest(data, 2); // 转换参数}}};// 客户端代码(与类适配器相同)void clientCode(const Target* target) {target->request("测试数据");}int main() {std::cout << "使用对象适配器:" << std::endl;Adaptee* adaptee = new Adaptee();Target* adapter = new ObjectAdapter(adaptee);clientCode(adapter); // 客户端通过适配器调用适配者// 注意释放顺序:先释放适配器,再释放适配者delete adapter;delete adaptee;return 0;}

三、代码解析

  1. 目标接口(Target):定义客户端需要的方法request(const std::string&),是客户端与适配器交互的标准。

  2. 适配者(Adaptee):存在一个specificRequest方法,但参数(多了int format)和名称与目标接口不兼容,无法被客户端直接调用。

  3. 适配器的作用

    • 类适配器通过继承Adaptee和实现Target,在request中调用父类的specificRequest,完成参数转换。
    • 对象适配器通过持有Adaptee指针,在request中调用其specificRequest,同样完成转换。
  4. 客户端:仅依赖Target接口,无需知道Adaptee的存在,实现了解耦。

四、两种实现方式的对比

对比维度类适配器(继承)对象适配器(组合)
实现方式继承适配者类,实现目标接口实现目标接口,持有适配者对象
灵活性只能适配特定适配者,无法适配其子类可适配适配者及其子类,更灵活
代码耦合与适配者类强耦合(继承关系)与适配者弱耦合(组合关系)
方法重写可重写适配者的方法无法重写适配者的方法(需通过其他方式)
适用场景适配者类稳定,且不需要适配其子类适配者可能变化,或需要适配多种子类

推荐优先使用对象适配器,因为组合比继承更灵活,且符合面向对象设计原则。

五、适用场景与优势

适用场景
  1. 集成 legacy 代码:当需要使用旧系统中的类,但它的接口与新系统不兼容时(如旧数据库驱动适配新ORM框架)。
  2. 复用第三方库:第三方库的接口不符合项目规范,通过适配器转换后再使用。
  3. 统一接口风格:将多个功能相似但接口不同的类,通过适配器统一为相同接口(如不同日志库统一为项目的日志接口)。
核心优势
  1. 兼容性:解决接口不兼容问题,使原本无法协作的类可以一起工作。
  2. 复用性:无需修改现有类(适配者)即可复用,保护现有代码。
  3. 透明性:客户端只需与目标接口交互,无需知道适配者的存在。
  4. 灵活性:通过更换不同适配器,可在不修改客户端的情况下切换适配者。

六、与其他模式的区别

模式核心差异点
适配器转换现有接口,解决“接口不兼容”问题,不改变原有功能。
装饰器不改变接口,为对象增加新功能,强调功能扩展。
外观(Facade)为复杂系统提供简化接口,关注“简化使用”,不涉及接口转换。
桥接(Bridge)分离抽象与实现,使两者可独立变化,解决“多维度变化”问题。

七、实践建议

  1. 优先对象适配器:除非必须继承适配者(如需要重写其方法),否则优先使用组合实现的对象适配器。
  2. 明确目标接口:设计清晰的Target接口,确保它能满足客户端需求。
  3. 适配多个适配者:一个适配器可适配多个相关的适配者(如同时适配数据读取和数据解析类)。
  4. 避免过度使用:不要为了适配而适配,若能直接修改接口,应优先修改而非引入适配器。

适配器模式是系统集成和代码复用的重要工具,尤其在维护 legacy 系统或整合第三方库时能显著降低耦合。其核心价值在于“在不破坏现有代码的前提下,实现接口兼容”,是结构型模式中解决“接口不匹配”问题的最佳方案。

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

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

相关文章

第三方应用测试:【移动应用后端API自动化测试:Postman与Newman的集成】 - 指南

第三方应用测试:【移动应用后端API自动化测试:Postman与Newman的集成】 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

(附源码)基于Spring Boot的宿舍管理系统设计与建立0007

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:【项目】Vision Master OpenCV 3.0 版本(预)发行说明

深入解析:【项目】Vision Master OpenCV 3.0 版本(预)发行说明pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…

Adobe Acrobat Pro DC 2025版破解版下载及安装使用教程

Adobe Acrobat Pro DC 2025版破解版下载及安装使用教程Adobe Acrobat Pro DC 2025是一款功能强大的PDF文档编辑和管理工具。这款软件内置了多种编辑和修复工具,能够帮助用户方便地创建、编辑、转换和共享PDF文档。不仅…

网页访问速度很慢,远程仓库调用很慢

访问测试一下IPv6 测试 ipv6失败就去 搜索——>控制面板——>网络与internet——>网络和共享中心——>修改设配器设置——>右击那个WLAN——>属性——>把下面那个ipv6协议关了——>确认然后没…

免费网站推广工具浙江平安建设信息系统网站

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的旅途中&#xff0c;Jenkins与版本控制系统的紧密集成是不可或缺的一环。本篇“持续集成03--Jenkins结合Gitee创建项目”将引导如何将Jenkins与Gitee&#xff08;一个流行的Git代码托管平台&#xff09;相结合&#xff…

详细介绍:Day51 时钟系统与定时器(EPIT/GPT)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

郑州惠济区建设局网站删除wordpress logo

一、虚拟机简介 1、Java 虚拟机 (1) 虚拟机&#xff1a; 虚拟机&#xff08;Virtual Machine&#xff09;是一种软件或硬件实体&#xff0c;它模拟了一个独立的计算环境&#xff0c;可以在其上运行应用程序。 虚拟机可分为系统虚拟机和程序虚拟机&#xff1a; ● 系统虚拟…

网站推广效果的评价指标有网页游戏哪个平台最好

还在担心网购服装对实际穿着效果没把握吗&#xff1f;随着京东App 6.6.3版本的更新&#xff0c;京东试试3D虚拟试衣功能正式上线&#xff0c;消费者可按照自己的身材比例创建专属的3D模型&#xff0c;而试穿效果则可以完全依照模型来展现。据了解&#xff0c;这个系统未来还将实…

网站开发敬请期待dw软件代码大全

阅读导航 引言一、线程池简单介绍二、Linux下线程池代码⭕Makefile文件⭕ . h 头文件✅Task.hpp✅thread.hpp✅threadPool.hpp ⭕ . cpp 文件✅testMain.cpp 三、线程池的优点温馨提示 引言 在Linux下&#xff0c;线程池是一种常见的并发编程模型&#xff0c;它能够有效地管理…

网站建设用图工作室网站建设的意义

时间限制 &#xff1a;1000 ms 内存限制&#xff1a;65536 KB 在一个旧式的火车站旁边有一座桥&#xff0c;其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢&#xff0c;如果将桥旋转180度&#xff0c;则可以把相邻两节车厢的位…

网页设计公司建网站网站设计南充建设工程信息网

如果你是一个硬件系统管理员或者Linux工程师&#xff0c;你可能会记得大多数Linux命令行技巧。下面的这些Linux命令行技巧通常不被Linux用户所使用。 1.使用pgrep快速查找一个PID pgrep遍历目前正在运行的进程然后列出符合查找规则的进程ID&#xff08;PID&#xff09;。 pg…

2025木方厂家权威推荐榜:实力工厂与优质供应之选

在建筑行业持续升级的背景下,木方作为基础建材的需求呈现出专业化、品质化的发展趋势。随着绿色建筑理念的普及和施工标准的提高,市场对木方产品的稳定性、耐久性和环保性能提出了更高要求。不同规模的工程项目在选材…

2017网站开发合同下载页面设计是什么专业

爱剪辑学习委员会提醒您&#xff1a;道路千万条&#xff0c;学习第一条。教程不学会&#xff0c;制作两行泪。今天教大家制作炫彩的动态标题文字特效&#xff0c;3步即可快速学会&#xff0c;让你立马不再流泪。爱剪辑官网下载&#xff1a;http://www.aijianji.com/爱剪辑LOGO效…

LoRa/LoRaWAN技术手册

第一部分 快速入门 第一章 第二部分 基础知识 第三部分 设备 第四部分 基站 第五部分 ChirpStack与App 第六部分 运维

便宜的 VPS

hostsailor https://clients.hostsailor.com/aff.php?aff=1356

2025南通宠物医院权威推荐榜:专业诊疗与暖心服务口碑之选

2025南通宠物医院权威推荐榜:专业诊疗与暖心服务口碑之选 在宠物医疗行业蓬勃发展的当下,南通地区的宠物医疗服务体系日趋完善。随着养宠人群对宠物健康重视程度的提升,专业诊疗技术与人性化服务已成为宠物医院发展…

企业网站建设设计公司现在c 做网站用什么

文章目录 &#x1f4dd; Notepad 简介&#x1f527; 主要特点打开.c文件示意高亮语法展示全局替换功能展示 &#x1f4dd; Notepad 简介 Notepad 是一款 免费的开源文本编辑器和源代码编辑器&#xff0c;运行在 Windows 系统上。 它是对 Windows 自带“记事本”的增强版本&…