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 10:50:22

OpenClaw:你的个人AI助手,多平台统一控制的革命性方案

在这个AI助手百花齐放的时代,你是否厌倦了在多个平台间来回切换?OpenClaw用一套系统统一了所有沟通渠道,让你真正拥有属于自己的AI助手。 🦞 什么是OpenClaw? OpenClaw是一个开源的个人AI助手平台,它可以在…

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

Java Web 房屋交易平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着互联网技术的快速发展,房地产行业逐渐向数字化转型,传统的房屋交易模式已无法满足用户对高效、透明和便捷服务的需求。线上房屋交易平台的出现,为用户提供了更加多样化的选择,同时也为开发商和中介机构拓宽了销售渠道。然…

作者头像 李华
网站建设 2026/5/30 1:46:29

5分钟部署Z-Image-ComfyUI,文生图一键生成超清美图

5分钟部署Z-Image-ComfyUI,文生图一键生成超清美图 你是否试过输入一段文字,几秒后眼前就浮现出一张高清、细腻、风格精准的图片?不是模糊的草图,不是失真的构图,而是真正能用在海报、社交配图甚至设计初稿里的成品—…

作者头像 李华
网站建设 2026/6/10 2:04:23

人脸识别OOD模型实际作品:质量分分层抽样生成的特征空间分布热力图

人脸识别OOD模型实际作品:质量分分层抽样生成的特征空间分布热力图 1. 什么是人脸识别OOD模型? 你可能已经用过很多人脸识别系统——刷脸打卡、门禁通行、手机解锁。但有没有遇到过这些情况: 光线太暗时,系统反复提示“请正对镜…

作者头像 李华
网站建设 2026/5/31 13:05:30

GLM-4V-9B教育行业应用:数学题图解分析+物理实验图数据提取

GLM-4V-9B教育行业应用:数学题图解分析物理实验图数据提取 1. 为什么教育工作者需要一个“看得懂图”的AI? 你有没有遇到过这样的场景: 学生发来一张手写的数学几何题照片,辅助线画得歪歪扭扭,角度标注挤在角落&…

作者头像 李华