【设计模式】适配器模式(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.mzph.cn/news/1132159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

1. 为什么这个毕设项目值得你 pick ? 宗教教育资源智慧管理系统旨在提供全面的数据管理与服务,系统功能模块化设计使得零基础开发者也能轻松上手。通过对比传统选题,“烂大街”毕设往往缺乏创新性、实用性及个性化需求满足能力;此项目则聚焦…

阿里明牌:淘宝闪购首要目标是份额增长,继续加大投入以达到市场绝对第一

雷递网 雷建平 1月8日2026年伊始之际,阿里对淘宝闪购新一年发展的战略明朗化。据阿里2026财年第三季度业绩前瞻信息,淘宝闪购自2025年4月发力以来,继续保持着强劲发展势头,2025年12月季度GMV份额持续增长,订单结构持续…

SpringBoot+Vue 墙绘产品展示交易平台管理平台源码【适合毕设/课设/学习】Java+MySQL

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着数字化时代的快速发展,传统墙绘行业面临展示渠道有限、交易效率低下等问题。墙绘作为一种艺术形式,其市场需求逐年增长…

基于Java的宗教文化创新智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 宗教文化创新智慧管理系统基于Java语言开发,采用SpringMVC框架与MySQL数据库实现。该系统具备会员管理、积分变动记录、资讯评论及活动管理等核心功能模块,特别适用于提升宗教文化的传播效率和互动体验。相较于传统…

SpringBoot+Vue Web足球青训俱乐部管理后台系统管理平台源码【适合毕设/课设/学习】Java+MySQL

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着足球青训行业的快速发展,传统的手工管理方式已无法满足现代化俱乐部对学员信息、训练计划和赛事数据的精细化需求。足球青训俱乐部…

基于Java的宗教活动安全智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 宗教活动安全智慧管理系统基于Java的开发,主要功能模块包括会员管理、预警管理等。该系统通过SpringMVC和MySQL实现了数据录入、查阅执行等功能,并提供了预警机制以保障安全管理及消防监控的安全性。传统选题多为通…

18款开源模型,上线Amazon Bedrock!

在re:Invent 2025,亚马逊云科技宣布Amazon Bedrock新增18款全托管开源模型,这批新模型来自Google、MiniMax AI、Mistral AI、Moonshot AI、NVIDIA、OpenAI及Qwen,其中包括Mistral Large 3模型,以及Ministral 3系列的3B、8B、14B三…

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

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

基于SpringBoot+Vue的社区医院信息平台管理系统设计与实现【Java+MySQL+MyBatis完整源码】

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着信息技术的快速发展和医疗行业的数字化转型,社区医院作为基层医疗服务的重要载体,其信息化建设显得尤为关键。传统的社…

基于Java的宗教社会调研智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 基于Java的宗教社会调研智慧管理系统的设计与实现旨在提供一个独特的选题,相比传统系统更具创新性、实用性和针对性。该系统涵盖会员管理、问卷管理等多个功能模块,适用于普通员工和部门领导角色。通过清晰的功能模…

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

1. 为什么这个毕设项目值得你 pick ? 基于Java的宗教博客智慧管理系统的设计与实现全,深入探讨了传统宗教博客系统在功能模块划分、用户体验等方面的不足。本文旨在提供一个创新性的解决方案——开发一款全面管理会员信息、文章内容等的宗教博客智慧管理系统。该系…

企业级IT交流和分享平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着信息技术的快速发展,企业级IT交流和分享平台在提升团队协作效率、促进知识共享方面发挥着重要作用。传统的信息交流方式如邮件、即…

基于Java的宗教家庭教育智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 宗教家庭教育智慧管理系统主要功能涵盖会员管理、学生家庭关系管理、家长教师课程管理等多个模块,旨在为教育机构提供全面的数据管理和智能决策支持。系统采用SpringMVC开发框架与MySQL数据库相结合的方式进行构建&#xff0c…

基于Java的宗教慈善公益智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 宗教慈善公益智慧管理系统通过Java语言结合SpringMVC框架与MySQL数据库实现,旨在提供全面的会员、捐赠项目、志愿者及受助人管理等模块。系统不仅包括账目记录和活动管理等功能,还涵盖审批流程、私信管理和邮件发送…

迁移学习还没整理好

参考文献: 1. (60 封私信 / 30 条消息) 对比学习(Contrastive Learning)概述 - 知乎 2.(60 封私信 / 30 条消息) 自监督学习和无监督 - 知乎 3.(60 封私信 / 30 条消息) 多模态视觉理解代理任务总结 - 知乎 4. 一文读懂迁移学习:从…

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

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

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

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

基于ssm+vue+mysql的供应商管理系统(源码+大文档+部署调试+讲解)

#计算机毕业设计 基于ssmvuemysql的供应商管理系统(源码大文档部署调试讲解),程序讲解视频:https://b23.tv/9HIafzF

大模型常见的专用名词

• RPM(Requests Per Minute):每分钟最多允许发起多少次请求(调用次数)。超过就会报限流。  • TPM(Tokens Per Minute):每分钟最多允许处理多少 token。token 可以理解…

pycharm一运行就是test怎么改

步骤:打开 File -> Settings -> Tools -> Python Integrated Tools。在 Testing 部分,将 Default test runner 改为 Unittests。