news 2026/6/9 23:49:37

设计模式——适配器模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式——适配器模式

适配器模式 (Adapter Pattern)

什么是适配器模式?

适配器模式是一种结构型设计模式,它允许不兼容的接口一起工作。适配器模式充当两个不兼容接口之间的桥梁。

简单来说:适配器模式就像一个转换器,让不兼容的接口能够协同工作。

生活中的例子

想象一下:

  • 电源适配器:220V电压转换为5V电压,给手机充电
  • 读卡器:SD卡转换为USB接口,让电脑能读取
  • 转接头:HDMI转VGA,让不同接口的设备连接

为什么需要适配器模式?

传统方式的问题

// 假设有一个第三方库,接口与我们系统不兼容ThirdPartyServiceservice=newThirdPartyService();service.doSomethingElse();// 接口不兼容,无法使用

问题

  1. 接口不兼容:第三方接口与我们的系统不兼容
  2. 修改困难:无法修改第三方代码
  3. 代码耦合:直接依赖第三方接口,耦合度高

适配器模式的优势

// 使用适配器Adapteradapter=newAdapter(newThirdPartyService());adapter.doSomething();// 通过适配器调用

优势

  1. 接口兼容:让不兼容的接口能够协同工作
  2. 无需修改:无需修改原有代码
  3. 解耦合:降低系统与第三方库的耦合度

适配器模式的结构

┌─────────────────────┐ │ Target │ 目标接口 ├─────────────────────┤ │ + request(): void │ └─────────────────────┘ ▲ │ 实现 │ ┌────────┴────────┐ │ Adapter │ 适配器 ├─────────────────┤ │ - adaptee: Adaptee│ │ + request(): void│ └────────┬────────┘ │ 组合 │ ┌────────┴────────┐ │ Adaptee │ 被适配者 ├─────────────────┤ │ + specificRequest(): void│ └─────────────────┘

代码示例

1. 定义目标接口

/** * 目标接口 */publicinterfaceTarget{/** * 请求方法 */voidrequest();}

2. 定义被适配者

/** * 被适配者:拥有不兼容接口的类 */publicclassAdaptee{/** * 特定请求方法(与目标接口不兼容) */publicvoidspecificRequest(){System.out.println("被适配者执行特定请求");}}

3. 定义适配器

/** * 适配器:将目标接口转换为被适配者的接口 */publicclassAdapterimplementsTarget{privateAdapteeadaptee;publicAdapter(Adapteeadaptee){this.adaptee=adaptee;}@Overridepublicvoidrequest(){System.out.println("适配器转换请求...");adaptee.specificRequest();}}

4. 使用适配器

/** * 适配器模式测试类 * 演示如何使用适配器模式让不兼容的接口协同工作 */publicclassAdapterTest{publicstaticvoidmain(String[]args){System.out.println("=== 适配器模式测试 ===\n");// 创建被适配者Adapteeadaptee=newAdaptee();System.out.println("--- 直接调用被适配者(不兼容) ---");System.out.println("客户端无法直接使用被适配者的接口");System.out.println("\n--- 使用适配器 ---");// 创建适配器Targettarget=newAdapter(adaptee);// 客户端通过目标接口调用target.request();System.out.println("\n=== 实际应用场景示例:电源适配器 ===");System.out.println("场景:中国的电器(220V)要在美国使用(110V)");System.out.println("解决方案:使用电源适配器将110V转换为220V");System.out.println("\n=== 适配器模式的优势 ===");System.out.println("1. 接口兼容:让不兼容的接口能够协同工作");System.out.println("2. 无需修改:无需修改原有代码");System.out.println("3. 解耦合:降低系统与第三方库的耦合度");System.out.println("4. 灵活扩展:可以轻松添加新的适配器");}}

适配器模式的优点

  1. 接口兼容:让不兼容的接口能够协同工作
  2. 无需修改:无需修改原有代码
  3. 解耦合:降低系统与第三方库的耦合度
  4. 灵活扩展:可以轻松添加新的适配器

适配器模式的缺点

  1. 增加复杂度:引入了额外的类
  2. 性能开销:多了一层调用

适用场景

  1. 接口不兼容:需要使用现有的类,但其接口与其他代码不兼容
  2. 复用第三方库:需要复用第三方库,但接口不兼容
  3. 统一接口:需要统一多个不兼容的接口

常见应用场景

  • 日志框架:适配不同的日志框架
  • 数据库访问:适配不同的数据库
  • 第三方API:适配第三方API接口

使用建议

  • 接口不兼容:使用适配器模式
  • 无法修改原有代码:使用适配器模式
  • 接口兼容:直接使用即可

注意事项

⚠️ 适配器模式虽然有用,但要注意:

  • 不要过度使用,增加不必要的复杂度
  • 考虑是否可以重构代码,而不是使用适配器
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 0:33:48

经方药食两用服务平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着中医药文化的普及和健康管理意识的提升,经方药食两用服务逐渐成为人们关注的焦点。传统的中医药服务模式存在信息分散、管理效率低、用户体验不佳等问题,亟需通过信息化手段优化服务流程。经方药食两用服务平台信息管理系统的开发旨在整合中医药…

作者头像 李华
网站建设 2026/6/5 15:42:10

Windows热键冲突终极解决方案:3步定位与企业级优化指南

Windows热键冲突终极解决方案:3步定位与企业级优化指南 【免费下载链接】hotkey-detective A small program for investigating stolen hotkeys under Windows 8 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 在Windows系统日常操作中&…

作者头像 李华
网站建设 2026/6/5 20:26:30

ccmusic-database数字音乐发行:独立音乐人上传作品自动获取流派标签

ccmusic-database数字音乐发行:独立音乐人上传作品自动获取流派标签 你是不是也遇到过这样的问题:辛辛苦苦做完一首原创曲子,上传到平台时却卡在“选择流派”这一步?选“独立流行”,怕不够准确;选“另类摇…

作者头像 李华
网站建设 2026/6/9 23:48:21

PDF解析神器QAnything:5步完成文档转换与表格识别

PDF解析神器QAnything:5步完成文档转换与表格识别 1. 为什么PDF解析总是让人头疼? 你有没有遇到过这样的场景:手头有一份几十页的PDF制度文件,需要快速提取关键条款、整理成结构化内容,或者把里面的表格数据导入Exce…

作者头像 李华
网站建设 2026/6/5 9:59:06

企业知识管理新选择:GTE-Pro语义引擎深度体验

企业知识管理新选择:GTE-Pro语义引擎深度体验 在企业日常运营中,你是否也遇到过这些场景: 新员工入职后翻遍共享文档,却找不到“差旅报销流程最新版”在哪;客服同事面对“系统登录不了”的工单,要在几十份…

作者头像 李华
网站建设 2026/6/5 5:01:51

[特殊字符] BEYOND REALITY Z-Image: 高精度写实文生图引擎的快速部署指南

🌌 BEYOND REALITY Z-Image: 高精度写实文生图引擎的快速部署指南 1. 为什么你需要这个模型——写实人像生成的新标准 你是否遇到过这样的困扰:生成的人像皮肤像塑料,光影生硬得像打光板直射,细节模糊得连睫毛都分不清&#xff…

作者头像 李华