当前位置: 首页 > 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.jsqmd.com/news/217696/

相关文章:

  • 阿里明牌:淘宝闪购首要目标是份额增长,继续加大投入以达到市场绝对第一
  • SpringBoot+Vue 墙绘产品展示交易平台管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 基于Java的宗教文化创新智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • SpringBoot+Vue Web足球青训俱乐部管理后台系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 基于Java的宗教活动安全智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 18款开源模型,上线Amazon Bedrock!
  • 基于Java的宗教物品进出境智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于SpringBoot+Vue的社区医院信息平台管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 基于Java的宗教社会调研智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于Java的宗教博客智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 企业级IT交流和分享平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 基于Java的宗教家庭教育智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于Java的宗教慈善公益智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 迁移学习还没整理好
  • 论文交导师前,如果你的细节里还没做这一步,真的很危险
  • 部署 Sphinx 文档到 GitHub Pages 详细指南
  • 基于ssm+vue+mysql的供应商管理系统(源码+大文档+部署调试+讲解)
  • 大模型常见的专用名词
  • pycharm一运行就是test怎么改
  • 同步互斥机制和编程方法
  • 程序员必读:2026年AI智能体趋势,收藏这篇抢占先机
  • Windows 系统版本转换工具,一键互转不用重装
  • 大数据领域数据治理的质量提升秘籍
  • 深入理解 MCP,非常详细收藏我这一篇就够了
  • 大模型Agent架构演进:从临时拼接到按需组合的微应用之路(程序员必收藏)
  • AI产品经理与大模型学习全攻略:从入门到精通,零基础也能掌握AI思维
  • 根据算法题目时间限制推算时间复杂度限制
  • AI大模型学习路线:从入门到高薪,程序员收藏必备!2025年AI就业薪资表曝光
  • FPGA应用开发和仿真【3.7】
  • 每日Java面试场景题知识点之-ELK技术栈实战应用