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/6/10 1:51:36

2026全年 AI Agent 每周细化学习计划表

核心原则:每天投入1-2小时,重实战、轻理论堆砌,每周完成1个核心任务1次小结;每阶段结束后预留1周复盘时间,查漏补缺。 第一阶段:理论筑基(第1-6周)—— 吃透核心概念与基础工具 周…

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

shiro学习要点

一、核心四大功能(核心核心) 认证(Authentication):验证用户身份(如账号密码登录),确认 "你是谁";授权(Authorization):验…

作者头像 李华
网站建设 2026/6/10 11:51:38

MusePublic Art Studio实战:设计师必备的AI绘画工具体验

MusePublic Art Studio实战:设计师必备的AI绘画工具体验 你是否经历过这样的时刻:灵感迸发,却卡在把脑海中的画面变成现实的第一步?反复调试参数、折腾环境、翻译提示词、等待渲染……创作热情被技术门槛一点点消磨。直到遇见 Mu…

作者头像 李华
网站建设 2026/6/10 11:50:46

ChatTTS-究极拟真语音合成实战案例:直播带货话术AI语音实时生成

ChatTTS-究极拟真语音合成实战案例:直播带货话术AI语音实时生成 1. 为什么直播带货急需“会呼吸”的AI语音? 你有没有听过那种AI配音?字正腔圆,但听着像在听电子词典朗读新闻——每个字都对,可就是让人想划走。直播间…

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

用万物识别镜像做智能相册,自动标注家庭照片

用万物识别镜像做智能相册,自动标注家庭照片 你是否也经历过这样的困扰:手机相册里存着上千张家庭照片——孩子第一次走路、老人过生日、旅行风景、节日聚餐……每一张都珍贵,却越来越难找?手动打标签太耗时,用手机自…

作者头像 李华
网站建设 2026/6/10 11:53:36

告别黑图困扰:WuliArt Qwen-Image Turbo BF16防爆技术详解

告别黑图困扰:WuliArt Qwen-Image Turbo BF16防爆技术详解 WuliArt Qwen-Image Turbo 是一款专为个人GPU用户打造的轻量级文生图系统,它不依赖云端服务、不强制订阅、不堆砌参数,而是用扎实的工程优化直击本地部署最痛的三个问题&#xff1a…

作者头像 李华