「软件设计模式」适配器模式(Adapter)

news2025/3/12 22:55:00

软件设计模式深度解析:适配器模式(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.运行截图

四、模式优势分析

  1. 接口兼容:有效解决新旧系统接口不匹配问题
  2. 复用性提升:无需修改现有代码即可复用遗留组件
  3. 灵活扩展:对象适配器支持运行时动态适配
  4. 解耦设计:将接口转换逻辑封装在独立适配器中

五、典型应用场景

  1. 系统升级过渡:渐进式重构过程中新旧组件协同工作
  2. 第三方库集成:统一不同库的接口规范
  3. 跨平台开发:适配不同操作系统API接口
  4. 数据格式转换:如XML与JSON数据格式互转

六、最佳实践建议

  1. 优先选择对象适配器以获得更好的灵活性
  2. 注意适配器生命周期管理(建议使用智能指针)
  3. 避免过度设计,仅在有真实接口不兼容时使用
  4. 结合工厂模式创建适配器提升可维护性

七、总结

        适配器模式体现了"封装变化"的设计原则,通过中间层转换实现接口兼容。在系统演进过程中,该模式能有效降低改造风险,提高代码复用率。理解适配器模式的本质,可以帮助我们在面对接口不兼容问题时,做出更优雅的架构设计决策。

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

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

相关文章

Dify平台搭建面试机器人

无代码搭建面试机器人 什么是Dify 什么是Dify Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员&#xff0c;也能…

如何通过AI轻松制作PPT?让PPT一键生成变得简单又高效

如何通过AI轻松制作PPT&#xff1f;让PPT一键生成变得简单又高效&#xff01;在这个信息化飞速发展的时代&#xff0c;PPT已经成为我们日常工作、学习和生活中不可或缺的一部分。无论是公司会议、学术报告&#xff0c;还是个人展示&#xff0c;PPT的作用都不容忽视。很多人对于…

从零开始部署DeepSeek:基于Ollama+Flask的本地化AI对话系统

从零开始部署DeepSeek&#xff1a;基于OllamaFlask的本地化AI对话系统 一、部署背景与工具选型 在AI大模型遍地开花的2025年&#xff0c;DeepSeek R1凭借其出色的推理能力和开源特性成为开发者首选。本文将以零基础视角&#xff0c;通过以下工具链实现本地化部署&#xff1a; …

STM32 CubeMx配置串口收发使用DMA并调用Idle模式(二)

本篇主要结合代码落实&#xff0c;之前串口已经配置好的DMA方式。 一、首先我们把串口看成一个对象&#xff0c;它有属性、私有数据和方法&#xff1b; 每个串口都有名字属性&#xff1b;有初始化、发送、接收方法&#xff1b;还有一个私有数据&#xff08;这个私有数据是每个…

使用Redis实现分布式锁,基于原本单体系统进行业务改造

一、单体系统下&#xff0c;使用锁机制实现秒杀功能&#xff0c;并限制一人一单功能 1.流程图&#xff1a; 2.代码实现&#xff1a; Service public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderSe…

Nginx内存池源代码剖析----ngx_create_pool函数

ngx_create_pool 是 Nginx 内存池 的初始化函数&#xff0c;负责创建并初始化一个内存池对象。它的作用是 为后续的内存分配操作提供统一的管理入口&#xff0c;通过预分配一块较大的内存区域&#xff0c;并基于此区域实现高效的内存分配、对齐管理和资源回收。 源代码定义&…

DeepSeek 开放平台无法充值 改用其他平台API调用DeepSeek-chat模型方法

近几天DeepSeek开放平台无法充值目前已经关闭状态&#xff0c;大家都是忙着接入DeepSeek模型 &#xff0c;很多人想使用DeepSeek怎么办&#xff1f; 当然还有改用其他平台API调用方法&#xff0c;本文以本站的提供chatgpt系统为例&#xff0c;如何修改DeepSeek-chat模型API接口…

QT基础一、学会建一个项目

注&#xff1a;因为CSDN有很多付费才能吃到的史&#xff0c;本人对此深恶痛绝&#xff0c;所以我打算出一期免费的QT基础入门专栏&#xff0c;这是QT基础知识的第一期&#xff0c;学会建一个项目&#xff0c;本专栏是适用于c / c基础不错的朋友的一个免费专栏&#xff0c;接下来…

科技引领未来,中建海龙C-MiC 2.0技术树立模块化建筑新标杆

在建筑行业追求高效与品质的征程中&#xff0c;中建海龙科技有限公司&#xff08;简称“中建海龙”&#xff09;以其卓越的创新能力和强大的技术实力&#xff0c;不断书写着装配式建筑领域的新篇章。1 月 10 日&#xff0c;由深圳安居集团规划&#xff0c;中建海龙与中海建筑共…

解锁养生秘籍,拥抱健康生活

在这个快节奏的时代&#xff0c;人们行色匆匆&#xff0c;常常在忙碌中忽略了健康。其实&#xff0c;养生并非遥不可及&#xff0c;它就藏在生活的细微之处&#xff0c;等待我们去发现和实践。 规律作息是健康的基础。日出而作&#xff0c;日落而息&#xff0c;顺应自然规律&am…

STM32 如何使用DMA和获取ADC

目录 背景 ‌摇杆的原理 程序 端口配置 ADC 配置 DMA配置 背景 DMA是一种计算机技术&#xff0c;允许某些硬件子系统直接访问系统内存&#xff0c;而不需要中央处理器&#xff08;CPU&#xff09;的介入&#xff0c;从而减轻CPU的负担。我们可以通过DMA来从外设&#xf…

细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性

现代细胞计数仪采用自动化方法&#xff0c;在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力&#xff0c;而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下&#xff0c;自动对焦可能会失效&#xff0c;从而影响细胞…

蓝桥杯备考:贪心算法之纪念品分组

P1094 [NOIP 2007 普及组] 纪念品分组 - 洛谷 这道题我们的贪心策略就是每次找出最大的和最小的&#xff0c;如果他们加起来不超过我们给的值&#xff0c;就分成一组&#xff0c;如果超过了&#xff0c;就把大的单独成一组&#xff0c;小的待定 #include <iostream> #i…

Win11配置wsl、ubuntu、docker

系统要求 安装WSL。 开通虚拟化&#xff1a; 准备工作 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestartwsl --set-default-versi…

尚硅谷爬虫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# 需求&#xff…

matlab汽车动力学半车垂向振动模型

1、内容简介 matlab141-半车垂向振动模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

【新品解读】AI 应用场景全覆盖!解码超高端 VU+ FPGA 开发平台 AXVU13F

「AXVU13F」Virtex UltraScale XCVU13P Jetson Orin NX 继发布 AMD Virtex UltraScale FPGA PCIE3.0 开发平台 AXVU13P 后&#xff0c;ALINX 进一步研究尖端应用市场&#xff0c;面向 AI 场景进行优化设计&#xff0c;推出 AXVU13F。 AXVU13F 和 AXVU13P 采用相同的 AMD Vir…

【Linux探索学习】第二十七弹——信号(上):Linux 信号基础详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 前面我们已经将进程通信部分讲完了&#xff0c;现在我们来讲一个进程部分也非常重要的知识点——信号&#xff0c;信号也是进程间通信的一…

redis解决高并发看门狗策略

当一个业务执行时间超过自己设定的锁释放时间&#xff0c;那么会导致有其他线程进入&#xff0c;从而抢到同一个票,所有需要使用看门狗策略&#xff0c;其实就是开一个守护线程&#xff0c;让守护线程去监控key&#xff0c;如果到时间了还未结束&#xff0c;就会将这个key重新s…

MySQL-事务隔离级别

事务有四大特性&#xff08;ACID&#xff09;&#xff1a;原子性&#xff0c;一致性&#xff0c;隔离性和持久性。隔离性一般在事务并发的时候需要保证事务的隔离性&#xff0c;事务并发会出现很多问题&#xff0c;包括脏写&#xff0c;脏读&#xff0c;不可重复读&#xff0c;…