news 2026/9/16 18:28:15

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【设计模式】适配器模式(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教程 - 廖雪峰的官方网站

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 18:28:13

基于Java的宗教物品进出境智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 宗教物品进出境智慧管理系统摒弃了传统的“烂大街”选题,专注于解决实际业务难题。系统通过个人管理、护照管理、行李托运管理等多模块构建,不仅全面覆盖宗教物品的全过程监管需求,还引入在线帮助管理和…

作者头像 李华
网站建设 2026/9/16 18:27:30

根据算法题目时间限制推算时间复杂度限制

核心思路:先明确基准值首先要建立一个基础认知:普通计算机在 1 秒内,大约能执行 1 亿(10^8)次 基本运算(比如加减乘除、变量赋值、条件判断等)。这个数值是经验值,不同评测机可能略有…

作者头像 李华
网站建设 2026/9/15 22:18:42

FPGA应用开发和仿真【3.7】

8.5 混频和相干解调混频,即两个信号做乘法,是在数字通信中很常用的信号处理方法。考虑两个单频信号Acos(ω1t 1)和cos(ω0t),一般前者为待处理的信号,而后者为已知的参考信号&#x…

作者头像 李华
网站建设 2026/9/8 10:25:08

收藏这篇!小白也能学会的AI知识库搭建全攻略

本文详细介绍如何使用AnythingLLM和DeepSeek R1搭建个人AI知识库,解决AI回答不准确的痛点。从下载安装、配置API、上传文档到知识检索问答,提供完整步骤指导。该方法简单高效、成本低廉,可创建可靠安全的私有知识库,大幅提升学习和…

作者头像 李华
网站建设 2026/9/15 1:43:44

2026AI产品经理与大模型学习路线图:从小白到专家的进阶指南

本文详细介绍了AI产品经理的三阶段学习路线(基础知识、专业技能、软技能)及实践经验积累方法,并提供了大模型学习资源,包括路线图、视频教程、技术文档、面试题等,帮助学习者系统掌握AI产品经理与大模型知识&#xff0…

作者头像 李华
网站建设 2026/9/13 23:46:49

解耦梯度学习解决多模态模型欠优化问题,性能提升超3%

本文揭示了多模态学习中欠优化问题的根本原因在于模态编码器与融合模块间的优化冲突,导致主导模态性能下降。为解决此问题,作者提出解耦梯度学习(DGL)框架,通过截断多模态损失反向传播到编码器的梯度,并引入单模态损失独立优化编码…

作者头像 李华