news 2026/4/3 4:59:09

【设计模式】适配器模式(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/3/28 23:09:37

基于Java的宝宝成长记录智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 宝宝成长记录智慧管理系统旨在提供全面、智能化的成长数据管理解决方案。该系统整合了会员账户管理、宝宝信息维护与各类生活事件的详细记录,覆盖从营养健康到学习活动等全方位内容。相较于传统管理系统,本项目创新…

作者头像 李华
网站建设 2026/4/2 1:26:55

论文交导师前,如果你的细节里还没做这一步,真的很危险

论文交导师前,如果你还没做这一步,真的很危险论文写完的那一刻, 很多人都会松一口气。目录齐了, 参考文献也对了, 从头到尾读了一遍, 也没发现明显问题。于是你很自然会想:“那就交吧&#xff0…

作者头像 李华
网站建设 2026/3/10 5:50:24

部署 Sphinx 文档到 GitHub Pages 详细指南

部署 Sphinx 文档到 GitHub Pages 指南 本文将详细介绍如何将 Sphinx 生成的文档部署到 GitHub Pages,包括手动部署和使用 GitHub Actions 的自动部署方案。我们将以 dlt645 项目的 Python 版本文档为例进行说明。 1. 准备工作 1.1 项目结构 在开始之前&#xf…

作者头像 李华