news 2026/6/23 20:27:35

【设计模式|第四篇】适配器模式:让不兼容的接口协同工作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【设计模式|第四篇】适配器模式:让不兼容的接口协同工作
  • 适配器模式详解
    • 基本概念
      • 现实生活中的例子
    • 核心角色
    • 优缺点分析
      • 优点
      • 缺点
    • 实现方式及选择
      • 类适配器
      • 对象适配器
      • 如何选择
    • 实际应用案例
    • 设计建议
    • 与其他模式的关系

适配器模式详解

基本概念

适配器模式(Adapter Pattern)是一种结构型设计模式,它的核心作用是将一个类的接口转换成客户端所期望的另一个接口,从而使原本因接口不兼容而不能在一起工作的类可以协同工作。

现实生活中的例子

你可以把它想象成一个我们日常生活中常用的电源适配器或转换头。比如:

  • 你的笔记本电脑电源是两脚插头(被适配者 Adaptee)
  • 但墙上的插座是三孔的(目标 Target)
  • 这时,你需要一个转换头(适配器 Adapter),它一端能插进三孔插座,另一端能接收你的两脚插头

另一个例子是USB转Type-C的转换器,让旧设备可以连接新接口的设备。

核心角色

适配器模式主要包含三个核心角色:

  1. Target (目标接口)

    • 客户端(Client)期望和它直接交互的接口
    • 在上面的例子里,就是那个三孔插座
    • 在软件中,通常是一个抽象类或接口
  2. Adaptee (被适配者)

    • 已存在的、但接口与Target不兼容的类
    • 也就是那个两脚插头
    • 包含有用的功能,但接口不匹配
  3. Adapter (适配器)

    • 模式的核心组件
    • 实现了Target接口
    • 内部包装了一个Adaptee类的实例
    • 负责将对Target接口的调用转换为对Adaptee接口的调用
    • 它就是那个转换头

优缺点分析

优点

  1. 增强类的复用性

    • 可以复用已存在的、功能强大的Adaptee类
    • 无需修改其源码
    • 示例:可以复用遗留系统中的功能类
  2. 提高灵活性和扩展性

    • 可以方便地替换或增加新的适配器
    • 来适配不同的Adaptee
    • 符合开闭原则(对扩展开放,对修改关闭)
  3. 解耦

    • 将客户端(Client)与具体的实现类(Adaptee)解耦
    • 客户端只需要和目标接口(Target)打交道
    • 降低系统耦合度

缺点

  1. 增加系统复杂性

    • 每适配一个类都需要增加一个适配器类
    • 过度使用会导致系统中的类数量增多
    • 代码可读性有所下降
    • 维护成本可能增加
  2. 类适配器的限制

    • 由于语言的单继承限制,类适配器一次最多只能适配一个Adaptee类
    • 要求Target必须是接口或抽象类
    • 灵活性不如对象适配器

实现方式及选择

适配器模式主要有两种实现方式:类适配器和对象适配器。

类适配器

实现原理

  • 通过类继承来实现
  • Adapter类同时继承Adaptee类并实现Target接口

特点

  • 由于Java是单继承,这意味着Adapter只能适配一个Adaptee类
  • 它的耦合度相对较高
  • 实现简单直接

示例代码

// Target接口interfaceTarget{voidrequest();}// Adaptee类classAdaptee{publicvoidspecificRequest(){System.out.println("执行特定的请求");}}// 类适配器classClassAdapterextendsAdapteeimplementsTarget{@Overridepublicvoidrequest(){specificRequest();// 调用父类方法}}

对象适配器

实现原理

  • 通过对象组合/关联来实现
  • Adapter类实现Target接口
  • 并在内部持有一个Adaptee类的实例

特点

  • 这种方式更加灵活
  • Adapter可以适配Adaptee的任何子类
  • 遵循"合成/聚合复用原则"
  • 是更推荐、更常用的实现方式

示例代码

// 对象适配器classObjectAdapterimplementsTarget{privateAdapteeadaptee;publicObjectAdapter(Adapteeadaptee){this.adaptee=adaptee;}@Overridepublicvoidrequest(){adaptee.specificRequest();// 委托给Adaptee}}

如何选择

选择标准:

  1. 优先选择对象适配器

    • 更灵活,可以适配多个Adaptee
    • 符合组合优于继承的原则
    • 更容易维护和扩展
  2. 类适配器适用场景

    • 当需要重写Adaptee的部分行为时
    • 当Adaptee和Target接口简单且固定时
    • 当确定不需要适配多个Adaptee时

实际应用案例

适配器模式在Java和常用框架中有广泛应用:

  1. java.util.Arrays.asList()

    • 这是一个典型的适配器
    • 它把一个数组(Adaptee)适配成一个List接口(Target)
    • 让我们可以用操作List的方式去操作一个数组
  2. Java IO中的字符流与字节流转换

    • InputStreamReader就是一个适配器
    • 它将一个字节输入流InputStream(Adaptee)适配成一个字符输入流Reader(Target)
    • 解决了处理文本文件时字节到字符的转换问题
    • OutputStreamWriter也是同理
  3. 日志框架SLF4J

    • SLF4J (Simple Logging Facade for Java) 本身是一个日志门面
    • 它的桥接包(如slf4j-log4j12)就是适配器
    • 让你的应用程序代码(Client)统一面向SLF4J的API(Target)编程
    • 底层可以无缝地切换到Log4j、Logback等具体的日志实现(Adaptee)
  4. Spring框架中的适配器

    • Spring MVC中的HandlerAdapter
    • 让不同类型的处理器(Controller)都能处理请求
    • 每种Controller类型都有对应的适配器实现
  5. JPA/Hibernate

    • 适配不同的数据库方言
    • 提供统一的JPA接口

设计建议

  1. 接口设计

    • 尽量保持Target接口的简洁和稳定
    • 考虑未来可能的扩展需求
  2. 性能考虑

    • 适配器可能带来一定的性能开销
    • 在性能关键路径上要谨慎使用
  3. 文档

    • 明确记录适配器的用途和适配关系
    • 方便后续维护
  4. 测试

    • 特别注意测试适配器的边界条件
    • 确保所有转换都正确无误

与其他模式的关系

  1. 与装饰器模式

    • 都使用组合
    • 但目的不同:适配器改变接口,装饰器增强功能
  2. 与外观模式

    • 外观模式简化接口
    • 适配器模式转换接口
  3. 与桥接模式

    • 桥接模式分离抽象和实现
    • 适配器模式使不兼容的接口协同工作

通过合理使用适配器模式,可以大大提高代码的复用性和系统的灵活性,是每个开发者都应该掌握的重要设计模式。

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

asgiref终极指南:高效解决Python异步通信难题

asgiref终极指南:高效解决Python异步通信难题 【免费下载链接】asgiref ASGI specification and utilities 项目地址: https://gitcode.com/gh_mirrors/as/asgiref 在当今高并发的Web应用开发中,你是否经常面临同步代码阻塞异步流程、线程安全问题…

作者头像 李华
网站建设 2026/6/22 17:29:55

医学影像深度学习知识点总结

T1像和T2像的区别 T1像便于显示解剖结构,T2像便于显示病灶部位.FLAIR像便于显示结合水变化情况,人体内有自由水和结合水的分布,结合水的变化情况往往反映了局部组织出现梗塞情况,这种情况下采用FLAIR成像可以将这样的变化显示出来. FLAIR像(液体反转恢复),约等于T2成像 TR,TE,F…

作者头像 李华
网站建设 2026/6/23 19:33:33

从零到一:自动化3D建模的免代码解决方案

从零到一:自动化3D建模的免代码解决方案 【免费下载链接】nerfstudio A collaboration friendly studio for NeRFs 项目地址: https://gitcode.com/GitHub_Trending/ne/nerfstudio 还在为复杂的3D建模软件感到头疼吗?想象一下,你只需要…

作者头像 李华
网站建设 2026/6/23 19:30:11

Kali中生成被控端

操作步骤:生成的被控端提交到www.virustotal.com检测

作者头像 李华
网站建设 2026/6/23 19:00:30

13、Linux 文本编辑与命令操作实用指南

Linux 文本编辑与命令操作实用指南 1. XEmacs:强大的编辑器 XEmacs 是 GNU 超级编辑器 Emacs 的变体,包含在 Caldera OpenLinux 中。在图形环境(如 X (KDE))下使用时,XEmacs 有额外的增强功能,这也是它名字中 “X” 的由来。而在终端中,它与普通的 Emacs 几乎完全相同…

作者头像 李华
网站建设 2026/6/23 14:43:45

20、Linux 备份全攻略

Linux 备份全攻略 1. 备份介质选择 如今,备份介质的选择丰富多样,以下为你详细介绍常见的几种备份介质: | 备份介质 | 特点 | 容量 | 速度 | 价格 | 可靠性 | | — | — | — | — | — | — | | 软盘 | 系统可能自带驱动器,方便获取,但速度慢、价格相对高,适合少量…

作者头像 李华