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

设计模式十四:适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端期望的另一个接口,使原本不兼容的类可以一起工作。

适配器模式的类型

  1. 类适配器(通过多重继承实现)

  2. 对象适配器(通过组合实现,更常用)

示例代码

1. 对象适配器示例(推荐方式)

#include <iostream>// 目标接口(客户端期望的接口)
class Target {
public:virtual ~Target() = default;virtual void request() const {std::cout << "Target: 标准请求\n";}
};// 需要适配的类(不兼容的接口)
class Adaptee {
public:void specificRequest() const {std::cout << "Adaptee: 特殊请求\n";}
};// 适配器类(将Adaptee接口转换为Target接口)
class Adapter : public Target {
private:Adaptee* adaptee;
public:Adapter(Adaptee* a) : adaptee(a) {}void request() const override {std::cout << "Adapter: 转换请求\n";adaptee->specificRequest();}
};int main() {Adaptee* adaptee = new Adaptee();Target* target = new Adapter(adaptee);target->request();  // 客户端调用统一的接口delete target;delete adaptee;return 0;
}

2. 类适配器示例(需要多重继承)

#include <iostream>// 目标接口
class Target {
public:virtual ~Target() = default;virtual void request() const {std::cout << "Target: 标准请求\n";}
};// 需要适配的类
class Adaptee {
public:void specificRequest() const {std::cout << "Adaptee: 特殊请求\n";}
};// 类适配器(通过多重继承)
class Adapter : public Target, private Adaptee {
public:void request() const override {std::cout << "Adapter: 转换请求\n";specificRequest();  // 调用Adaptee的方法}
};int main() {Target* target = new Adapter();target->request();delete target;return 0;
}

 UML结构

 

要点总结

1、Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
2、GoF 23 定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
3、Adapter模式可以实现的非常灵活,不必拘泥于Gof23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。 

适配器模式的应用场景

  1. 需要使用现有类,但其接口与你的代码不兼容时

  2. 想复用一些现有的子类,但这些子类缺少一些公共功能

  3. 需要统一多个不同类的接口

优点

  • 单一职责原则:可以将接口转换代码与业务逻辑分离

  • 开闭原则:可以在不修改现有代码的情况下引入新的适配器

缺点

  • 代码整体复杂度增加:需要新增一系列接口和类

 

适配器模式在C++标准库中也有应用,例如stackqueue就是通过适配其他容器(如deque)实现的。 

http://www.dtcms.com/a/305486.html

相关文章:

  • MCP提示词工程:上下文注入的艺术与科学
  • 【计算机视觉与代码大模型全景解析:从理论基础到学习路线】
  • VSCode高效集成开发全流程优化
  • [论文阅读] 人工智能 + 软件工程 | 增强RESTful API测试:针对MongoDB的搜索式模糊测试新方法
  • Jaeger理论、实战、问题记录
  • Python 中使用 OpenCV 库来捕获摄像头视频流并在窗口中显示
  • RAG实战指南 Day 28:RAG系统缓存与性能优化
  • Web3:赛道划分与发展趋势解析
  • JDBC编程笔记
  • 创建型设计模式-Builder
  • Git链接备用手册
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博内容IP地图可视化分析实现
  • 《设计模式之禅》笔记摘录 - 11.策略模式
  • 15 - 多模态大语言模型 — 图文 “牵线” 系统 “成长记”:借 CLIP 练本领,从图像与文字里精准 “搭鹊桥” 的全过程 (呆瓜版 - 2 号)
  • Java源码构建智能名片小程序
  • 短剧小程序系统开发:重塑影视内容消费格局
  • 北京理工大学医工交叉教学实践分享(1)|如何以实践破解数据挖掘教学痛点
  • 招工招聘小程序系统开发——打造一站式招聘服务平台
  • DISTILLM:迈向大型语言模型的简化蒸馏方法
  • 基于动态权重-二维云模型的川藏铁路桥梁施工风险评估MATLAB代码
  • [硬件电路-106]:模拟电路 - 电路为什么会出现不同的频率特性?元件频率依赖性、信号传输路径、电路拓扑结构、外部因素
  • 新手向:DeepSeek 部署中的常见问题及解决方案
  • C语言:函数指针、二级指针、常量指针常量、野指针
  • 域名https证书
  • 【动态规划算法】斐波那契数列模型
  • 深入理解PostgreSQL的MVCC机制
  • webpack-性能优化
  • 告别内存泄漏:你的Rust语言30天征服计划
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | 3dBackgroundBoxes(3D背景盒子组件)
  • Prometheus-2--什么是Exporter是什么?