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

【设计模式】适配器模式(Adapter)详解

文章目录

    • 1. 引言:一个现实中的“接口不兼容”问题
    • 2. 什么是适配器模式
      • GoF 定义
    • 3. 适配器模式的核心思想
    • 4. 适配器模式的角色组成
    • 5. 对象适配器(最常用,推荐)
      • 5.1 目标接口
      • 5.2 被适配者
      • 5.3 适配器实现
      • 5.4 客户端使用
      • 5.5 特点分析
    • 6. 类适配器(基于继承)
      • 6.1 适配器实现
      • 6.2 特点
    • 7. 接口适配器(缺省适配器)
      • 7.1 使用背景
      • 7.2 抽象适配器
      • 7.3 客户端使用
    • 8. 适配器模式的典型应用场景
    • 9. JDK 中的适配器模式
      • `InputStreamReader`
    • 10. 适配器 vs 代理 vs 装饰器
    • 11. 适配器模式的优点
    • 12. 适配器模式的缺点
    • 13. 何时使用适配器模式
      • 适合使用
      • 不适合使用
    • 参考

1. 引言:一个现实中的“接口不兼容”问题

在实际开发中,我们经常会遇到这样的场景:

  • 引入第三方库,但它的接口与你现有系统不一致
  • 老系统接口无法修改,但新代码已经按新接口编写
  • 不同模块由不同团队开发,接口设计不统一

例如:

// 系统期望的接口voidrequest();// 现有类提供的接口voidspecificRequest();

这时你面临一个选择:

  • 修改已有类(风险高、不可控)
  • 在客户端做各种 if-else 适配(代码混乱)

有没有一种方式,在不修改原有代码的前提下,让接口“对得上”

答案就是——适配器模式


2. 什么是适配器模式

GoF 定义

将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

一句话理解:

适配器模式 = 接口转换器。


3. 适配器模式的核心思想

适配器模式关注的不是功能增强(那是代理 / 装饰器),而是:

解决“接口不匹配”的问题。

它的本质是:

  • 客户端依赖目标接口(Target)
  • 适配器在内部调用已有接口(Adaptee)
  • 对外“伪装”成客户端需要的接口

4. 适配器模式的角色组成

适配器模式通常包含三个角色:

  1. 目标接口(Target)
    • 客户端期望的接口,即当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 被适配者(Adaptee)
    • 已存在但接口不兼容的类,它是被访问和适配的现存组件库中的组件接口。
  3. 适配器(Adapter)
    • 进行接口转换,它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

5. 对象适配器(最常用,推荐)

5.1 目标接口

publicinterfaceTarget{voidrequest();}

5.2 被适配者

publicclassAdaptee{publicvoidspecificRequest(){System.out.println("原有接口的实现");}}

5.3 适配器实现

publicclassObjectAdapterimplementsTarget{privatefinalAdapteeadaptee;publicObjectAdapter(Adapteeadaptee){this.adaptee=adaptee;}@Overridepublicvoidrequest(){adaptee.specificRequest();}}

5.4 客户端使用

Targettarget=newObjectAdapter(newAdaptee());target.request();

5.5 特点分析

  • 基于组合(推荐)
  • 灵活、安全
  • 可适配多个被适配者

6. 类适配器(基于继承)

6.1 适配器实现

publicclassClassAdapterextendsAdapteeimplementsTarget{@Overridepublicvoidrequest(){specificRequest();}}

6.2 特点

  • 基于继承
  • 只能适配一个类
  • 不支持多继承(Java 限制)

7. 接口适配器(缺省适配器)

7.1 使用背景

当接口中方法很多,但你只想实现其中一部分:

publicinterfaceListener{voidonClick();voidonDoubleClick();voidonLongClick();}

7.2 抽象适配器

publicabstractclassListenerAdapterimplementsListener{@OverridepublicvoidonClick(){}@OverridepublicvoidonDoubleClick(){}@OverridepublicvoidonLongClick(){}}

7.3 客户端使用

publicclassClickListenerextendsListenerAdapter{@OverridepublicvoidonClick(){System.out.println("处理点击事件");}}

8. 适配器模式的典型应用场景

  1. 老系统改造
  2. 第三方 SDK 接入
  3. 统一接口规范
  4. 系统迁移、重构
  5. 框架设计

9. JDK 中的适配器模式

InputStreamReader

InputStreamin=newFileInputStream("test.txt");Readerreader=newInputStreamReader(in);
  • InputStream→ 字节流
  • Reader→ 字符流
  • InputStreamReader就是适配器

10. 适配器 vs 代理 vs 装饰器

模式核心目的
适配器接口转换
代理控制访问
装饰器功能增强

关注点不同,切勿混用。


11. 适配器模式的优点

  1. 复用已有代码
  2. 符合开闭原则
  3. 解耦客户端与实现
  4. 提高系统灵活性

12. 适配器模式的缺点

  1. 增加系统复杂度
  2. 过度使用会导致结构混乱
  3. 不易调试(调用链变长)

13. 何时使用适配器模式

适合使用

  • 接口不兼容,但又不能改原代码
  • 需要快速集成第三方库
  • 系统升级、兼容旧接口

不适合使用

  • 能直接修改接口的场景
  • 系统接口设计初期

参考

适配器模式 | 菜鸟教程

适配器模式-百度百科

《图解设计模式》

适配器 - Java教程 - 廖雪峰的官方网站

适配器设计模式(封装器模式)

http://www.cnnetsun.cn/news/506112.html

相关文章:

  • 基于Java的宗教物品进出境智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 根据算法题目时间限制推算时间复杂度限制
  • FPGA应用开发和仿真【3.7】
  • 收藏这篇!小白也能学会的AI知识库搭建全攻略
  • 2026AI产品经理与大模型学习路线图:从小白到专家的进阶指南
  • 解耦梯度学习解决多模态模型欠优化问题,性能提升超3%
  • 零代码搭建大模型知识库,5分钟搞定RAG应用,小白也能轻松上手
  • springboot事务触发滚动与不滚蛋
  • 鸿蒙PC上Electron原生应用开发:从零到部署的实战避坑指南
  • 鸿蒙PC开发指南:从零配置Qt环境到实战部署完整流程
  • 前后端分离海滨体育馆管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 二十三种设计模式(二十二)--策略模式
  • Java SpringBoot+Vue3+MyBatis 学科竞赛管理系统源码|前后端分离+MySQL数据库
  • 大数据领域数据架构的发展趋势洞察
  • Apache Paimon多模态数据湖实践:从结构化到非结构化的技术演进
  • 开源版 Manus 火爆全网,狂揽 7.5 万 GitHub Star!
  • MATLAB实现大规模K-means聚类并保存分区结果到二进制文件
  • MATLAB实现图正则化稀疏编码的系数求解:Feature-Sign Search算法详解
  • 28.useMutationObserver
  • 精通plotnine:仅为特定数据组添加误差条
  • 提示工程架构师的“用户调研方法“:如何获取有效的Prompt设计需求
  • UE5 C++(15):宏 UFUNCTION() 修饰成员函数,BlueprintCallable,Category,BlueprintPure 纯函数,
  • [特殊字符]_网络IO性能优化:从TCP到HTTP的层层优化[20260108163835]
  • 注意,科学家、数学家不一定是智能学家
  • 【确认出席】叶光辉 盐城市住房公积金管理中心技术信息处副处长丨上海·1月14日
  • 全渠道 AI 推荐,如何终结创作者的“效率焦虑”?
  • Soundflower音频路由神器:彻底释放Mac音频系统的无限潜能
  • 谁说思维链越长越好?Yuan3.0 Flash开源:砍掉70%无效token,重构推理范式
  • WE Learn AI学习助手终极指南:5步轻松开启智能学习模式
  • Diffusers库安装