「软件设计模式」适配器模式(Adapter)
软件设计模式深度解析:适配器模式(Adapter)(C++实现)

一、模式概述
适配器模式(Adapter Pattern)是结构型设计模式中的"接口转换器",它像现实世界中的电源适配器一样,能够让原本接口不兼容的类协同工作。该模式通过包装对象的方式,将被适配者的接口转换为目标接口,是解决系统升级、组件复用等场景下接口不兼容问题的利器。
二、模式思想
1. 核心组件
- 目标接口(Target):客户端期望的接口规范
- 被适配者(Adaptee):需要被适配的已有组件
- 适配器(Adapter):实现目标接口并包装被适配者的中间件
2. 实现方式对比
| 类型 | 实现机制 | 灵活性 | 继承层次 |
|---|---|---|---|
| 类适配器 | 多重继承 | 较低 | 编译期绑定 |
| 对象适配器 | 对象组合 | 较高 | 运行时绑定 |
三、代码实现
1. 类适配器(继承实现)
#include <iostream>// 目标接口(新系统标准)
class CloudStorage {
public:virtual ~CloudStorage() = default;virtual void uploadFile(const std::string& localPath) = 0;
};// 被适配者(旧版存储服务)
class LegacyFTP {
public:void connectServer(const std::string& ip, int port) {std::cout << "FTP Connected to " << ip << ":" << port << std::endl;}void sendFile(const std::string& filePath) {std::cout << "FTP Uploading: " << filePath << std::endl;}
};// 类适配器(多重继承)
class FTPAdapter : public CloudStorage, private LegacyFTP {
public:void uploadFile(const std::string& localPath) override {connectServer("ftp.cloud.com", 21);sendFile(localPath);std::cout << "Upload completed via FTP adapter" << std::endl;}
};
2. 对象适配器(组合实现)
#include "adapter.h"
// 对象适配器(组合方式)
class ObjectFTPAdapter : public CloudStorage {
private:LegacyFTP* ftpClient;public:explicit ObjectFTPAdapter(LegacyFTP* ftp) : ftpClient(ftp) {}void uploadFile(const std::string& localPath) override {ftpClient->connectServer("ftp.newcloud.com", 2021);ftpClient->sendFile(localPath);std::cout << "Upload completed via Object Adapter" << std::endl;}
};// 客户端调用示例
int main() {// 类适配器调用CloudStorage* classAdapter = new FTPAdapter();classAdapter->uploadFile("/data/report.pdf");// 对象适配器调用LegacyFTP legacyFtp;CloudStorage* objAdapter = new ObjectFTPAdapter(&legacyFtp);objAdapter->uploadFile("/data/presentation.pptx");delete classAdapter;delete objAdapter;return 0;
}
3.运行截图

四、模式优势分析
- 接口兼容:有效解决新旧系统接口不匹配问题
- 复用性提升:无需修改现有代码即可复用遗留组件
- 灵活扩展:对象适配器支持运行时动态适配
- 解耦设计:将接口转换逻辑封装在独立适配器中
五、典型应用场景
- 系统升级过渡:渐进式重构过程中新旧组件协同工作
- 第三方库集成:统一不同库的接口规范
- 跨平台开发:适配不同操作系统API接口
- 数据格式转换:如XML与JSON数据格式互转
六、最佳实践建议
- 优先选择对象适配器以获得更好的灵活性
- 注意适配器生命周期管理(建议使用智能指针)
- 避免过度设计,仅在有真实接口不兼容时使用
- 结合工厂模式创建适配器提升可维护性
七、总结
适配器模式体现了"封装变化"的设计原则,通过中间层转换实现接口兼容。在系统演进过程中,该模式能有效降低改造风险,提高代码复用率。理解适配器模式的本质,可以帮助我们在面对接口不兼容问题时,做出更优雅的架构设计决策。
相关文章:
「软件设计模式」适配器模式(Adapter)
软件设计模式深度解析:适配器模式(Adapter)(C实现) 一、模式概述 适配器模式(Adapter Pattern)是结构型设计模式中的"接口转换器",它像现实世界中的电源适配器一样&#…...
Dify平台搭建面试机器人
无代码搭建面试机器人 什么是Dify 什么是Dify Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能…...
Vue 3 中可读可写的计算属性(Computed Properties)的使用场景
在 Vue 3 中,计算属性(Computed Properties)是一种基于响应式依赖进行缓存的属性。它们通常用于处理复杂的逻辑,并且只有当依赖的响应式数据发生变化时,才会重新计算。计算属性非常适合用于处理模板中的复杂表达式&…...
如何通过AI轻松制作PPT?让PPT一键生成变得简单又高效
如何通过AI轻松制作PPT?让PPT一键生成变得简单又高效!在这个信息化飞速发展的时代,PPT已经成为我们日常工作、学习和生活中不可或缺的一部分。无论是公司会议、学术报告,还是个人展示,PPT的作用都不容忽视。很多人对于…...
从零开始部署DeepSeek:基于Ollama+Flask的本地化AI对话系统
从零开始部署DeepSeek:基于OllamaFlask的本地化AI对话系统 一、部署背景与工具选型 在AI大模型遍地开花的2025年,DeepSeek R1凭借其出色的推理能力和开源特性成为开发者首选。本文将以零基础视角,通过以下工具链实现本地化部署: …...
STM32 CubeMx配置串口收发使用DMA并调用Idle模式(二)
本篇主要结合代码落实,之前串口已经配置好的DMA方式。 一、首先我们把串口看成一个对象,它有属性、私有数据和方法; 每个串口都有名字属性;有初始化、发送、接收方法;还有一个私有数据(这个私有数据是每个…...
使用Redis实现分布式锁,基于原本单体系统进行业务改造
一、单体系统下,使用锁机制实现秒杀功能,并限制一人一单功能 1.流程图: 2.代码实现: Service public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderSe…...
数据结构中的邻接表
一、概念 邻接表(Adjacency List)是一种用于表示图(Graph)数据结构的常用方法。它特别适用于稀疏图,即边的数量远小于顶点数量平方的图。邻接表通过为每个顶点维护一个列表来存储与该顶点相邻的顶点,从而高…...
js第九题
题九:放大镜效果 要求: 1.鼠标移至图片上方,鼠标周围出现黄色的的正方形框,黄色矩形 框会随着鼠标的移动而移动; 2.将黄色正方形框里的内容的长和宽均放大2.4倍,并在图片右边进 行显示。 html <div …...
基于单片机ht7038 demo
单片机与ht7038 demo,三相电能表,电量数据包括电流电压功能,采用免校准方法 列表 ht7038模块/CORE/core_cm3.c , 17273 ht7038模块/CORE/core_cm3.h , 85714 ht7038模块/CORE/startup_stm32f10x_hd.s , 15503 ht7038模块/CORE/startup_stm32…...
轮播图html
题十二:轮播图 要求: 1.鼠标不在图片上方时,进行自动轮播,并且左右箭头不会显示;当鼠标放在图片上方时,停止轮播,并且左右箭头会显示; 2.图片切换之后,图片中下方的小圆…...
Nginx内存池源代码剖析----ngx_create_pool函数
ngx_create_pool 是 Nginx 内存池 的初始化函数,负责创建并初始化一个内存池对象。它的作用是 为后续的内存分配操作提供统一的管理入口,通过预分配一块较大的内存区域,并基于此区域实现高效的内存分配、对齐管理和资源回收。 源代码定义&…...
DeepSeek 开放平台无法充值 改用其他平台API调用DeepSeek-chat模型方法
近几天DeepSeek开放平台无法充值目前已经关闭状态,大家都是忙着接入DeepSeek模型 ,很多人想使用DeepSeek怎么办? 当然还有改用其他平台API调用方法,本文以本站的提供chatgpt系统为例,如何修改DeepSeek-chat模型API接口…...
QT基础一、学会建一个项目
注:因为CSDN有很多付费才能吃到的史,本人对此深恶痛绝,所以我打算出一期免费的QT基础入门专栏,这是QT基础知识的第一期,学会建一个项目,本专栏是适用于c / c基础不错的朋友的一个免费专栏,接下来…...
科技引领未来,中建海龙C-MiC 2.0技术树立模块化建筑新标杆
在建筑行业追求高效与品质的征程中,中建海龙科技有限公司(简称“中建海龙”)以其卓越的创新能力和强大的技术实力,不断书写着装配式建筑领域的新篇章。1 月 10 日,由深圳安居集团规划,中建海龙与中海建筑共…...
解锁养生秘籍,拥抱健康生活
在这个快节奏的时代,人们行色匆匆,常常在忙碌中忽略了健康。其实,养生并非遥不可及,它就藏在生活的细微之处,等待我们去发现和实践。 规律作息是健康的基础。日出而作,日落而息,顺应自然规律&am…...
STM32 如何使用DMA和获取ADC
目录 背景 摇杆的原理 程序 端口配置 ADC 配置 DMA配置 背景 DMA是一种计算机技术,允许某些硬件子系统直接访问系统内存,而不需要中央处理器(CPU)的介入,从而减轻CPU的负担。我们可以通过DMA来从外设…...
细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性
现代细胞计数仪采用自动化方法,在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力,而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下,自动对焦可能会失效,从而影响细胞…...
DeepSeek教unity------MessagePack-01
中文:GitCode - 全球开发者的开源社区,开源代码托管平台 MessagePack是C# 的极速 MessagePack 序列化器。它比 MsgPack-Cli 快 10 倍,并且性能超过其他 C# 序列化器。MessagePack for C# 还内置支持 LZ4 压缩——一种极其快速的压缩算法。性能在诸如游戏…...
vite+vue3开发uni-app时低版本浏览器不支持es6语法的问题排坑笔记
重要提示:请首先完整阅读完文章内容后再操作,以免不必要的时间浪费!切记!!!在使用vitevue3开发uni-app项目时,存在低版本浏览器不兼容es6语法的问题,如“?.” “??” 等。为了方便…...
WPF-数据转换器
一、单值转换器 1.不传参数 转换器 当Value值大于100时返回红色 public class DataConverter : IValueConverter{/// <summary>/// 表示从源到目标数据转换/// </summary>/// <param name"value">数据源的值</param>/// <param name&q…...
蓝桥杯备考:贪心算法之纪念品分组
P1094 [NOIP 2007 普及组] 纪念品分组 - 洛谷 这道题我们的贪心策略就是每次找出最大的和最小的,如果他们加起来不超过我们给的值,就分成一组,如果超过了,就把大的单独成一组,小的待定 #include <iostream> #i…...
Win11配置wsl、ubuntu、docker
系统要求 安装WSL。 开通虚拟化: 准备工作 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestartwsl --set-default-versi…...
以mysql驱动为案例,从源码角度深入分析Java的SPI机制
本文将以mysql驱动为案例,深入跟踪源码分析Java的SPI(Service Provider Interface)机制。 环境 java 8,mysql8.0,mysql-connector-java 8.0.20 代码 public class MysqlConnectorTest {public static void main(St…...
市盈率(P/E Ratio):理解股票价格与盈利的关系(中英双语)
市盈率(P/E Ratio):理解股票价格与盈利的关系 今天在阅读《漫步华尔街》(原书第13版)的过程中,看到了“股票价格是每股盈利的 6 倍”的类似表述,于是产生了本文。 在投资股票时,投资…...
尚硅谷爬虫note008
一、handler处理器 定制更高级的请求头 # _*_ coding : utf-8 _*_ # Time : 2025/2/17 08:55 # Author : 20250206-里奥 # File : demo01_urllib_handler处理器的基本使用 # Project : PythonPro17-21# 导入 import urllib.request from cgitb import handler# 需求ÿ…...
AWS上基于高德地图API验证Amazon Redshift里国内地址数据正确性的设计方案
该方案通过无服务架构实现高可扩展性,结合分页查询和批量更新确保高效处理海量数据,同时通过密钥托管和错误重试机制保障安全性及可靠性。 一、技术栈 组件技术选型说明计算层AWS Lambda无服务器执行,适合事件驱动、按需处理,成…...
matlab汽车动力学半车垂向振动模型
1、内容简介 matlab141-半车垂向振动模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
【新品解读】AI 应用场景全覆盖!解码超高端 VU+ FPGA 开发平台 AXVU13F
「AXVU13F」Virtex UltraScale XCVU13P Jetson Orin NX 继发布 AMD Virtex UltraScale FPGA PCIE3.0 开发平台 AXVU13P 后,ALINX 进一步研究尖端应用市场,面向 AI 场景进行优化设计,推出 AXVU13F。 AXVU13F 和 AXVU13P 采用相同的 AMD Vir…...
智能硬件定位技术发展趋势
在科技飞速进步的当下,智能硬件定位技术作为众多领域的关键支撑,正沿着多元且极具创新性的路径蓬勃发展,持续重塑我们的生活与工作方式。 一、精度提升的极致追求 当前,智能硬件定位精度虽已满足诸多日常应用,但未来…...
