当前位置: 首页 > article >正文

23种设计模式 - 适配器模式

模式定义

适配器模式(Adapter Pattern)是一种结构型设计模式,用于解决接口不兼容问题。它通过将一个类的接口转换为客户端期望的接口,使原本因接口不匹配而无法协同工作的类能够协同工作。适配器模式分为类适配器(通过继承实现)和对象适配器(通过组合实现)两种类型。


模式结构

目标接口(Target):客户端期望的接口(如数控系统的传感器接口)。
适配者(Adaptee):需要被适配的现有类(如第三方传感器)。
适配器(Adapter):实现目标接口,并持有适配者的实例,负责接口转换。


适用场景

集成遗留系统或第三方组件时接口不兼容。
统一多个类接口以简化客户端调用(如数控系统中不同厂商的传感器)。


C++示例(数控系统场景)

场景说明:
数控系统需要读取传感器数据,但旧系统使用OldSensor接口,新引入的第三方传感器NewSensor接口不同,需通过适配器统一接口。

#include 
#include 

// 目标接口:数控系统期望的传感器接口
class Sensor {
public:
    virtual ~Sensor() = default;
    virtual std::string getData() = 0;  // 统一的数据获取接口
};

// 旧传感器(直接兼容目标接口)
class OldSensor : public Sensor {
public:
    std::string getData() override {
        return "旧传感器数据: 转速=1500 RPM";
    }
};

// 适配者:第三方新传感器(接口不兼容)
class NewSensor {
public:
    std::string fetchData() {
        return "新传感器数据: 温度=80°C, 振动=0.05mm";
    }
};

// 对象适配器(组合方式)
class NewSensorAdapter : public Sensor {
private:
    NewSensor* newSensor;  // 持有适配者实例
public:
    NewSensorAdapter(NewSensor* sensor) : newSensor(sensor) {}
    std::string getData() override {
        // 调用适配者的方法并转换格式
        return "[适配后] " + newSensor->fetchData();
    }
};

// 客户端(数控系统)
int main() {
    // 使用旧传感器
    Sensor* oldSensor = new OldSensor();
    std::cout << oldSensor->getData() << std::endl;

    // 使用适配后的新传感器
    NewSensor newSensor;
    Sensor* adaptedSensor = new NewSensorAdapter(&newSensor);
    std::cout << adaptedSensor->getData() << std::endl;

    delete oldSensor;
    delete adaptedSensor;
    return 0;
}

代码说明
目标接口:Sensor定义了数控系统所需的getData()方法。
适配者:NewSensor提供实际功能但接口不兼容(fetchData())。
适配器:NewSensorAdapter继承Sensor并组合NewSensor,在getData()中调用fetchData()并封装结果。

输出结果:

旧传感器数据: 转速=1500 RPM
[适配后] 新传感器数据: 温度=80°C, 振动=0.05mm

模式优势

复用性:无需修改适配者代码即可集成新功能。
灵活性:支持动态切换适配器类型(如不同厂商传感器)。


http://www.kler.cn/a/551620.html

相关文章:

  • CES Asia 2025“传播势能放大器”:科技与环保的双重盛宴
  • 9.PG数据库层权限管理(pg系列课程)第2遍
  • 【HBase】HBaseJMX 接口监控信息实现钉钉告警
  • 代理和NAT多路转接
  • 3.7大模型开发环境搭建:从单卡到分布式集群的全栈指南
  • Maven Repository 与 Artifactory 使用
  • QT6开发高性能企业视频会议-7 Linux中文输入法的支持
  • openEuler-24.03-LTS/virtual_machine_img 版本的安装
  • STM32完全学习——RT-thread标准版移植
  • Ubuntu学习备忘
  • Mybatis高级(动态SQL)
  • Stream流简单使用
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter16-DOM2 和 DOM3
  • 人工智能(AI)在癌症休眠研究及精准肿瘤学中的应用|顶刊速递·25-02-18
  • 本地DeepSeek模型GGUF文件转换为PyTorch格式
  • 动态规划算法篇:枚举的艺术
  • 嵌入式八股文(四)计算机网络篇
  • uniapp编写微信小程序:project.config.json: libVersion 字段需为 string, string
  • java项目打包成docker镜像步骤
  • LeetCode 热题 100_分割回文串(61_131_中等_C++)(递归(回溯))(回溯问题使用类成员变量还是函数传参)