0

0

什么是适配器模式 (Adapter)_让不兼容的接口协同工作

P粉602998670

P粉602998670

发布时间:2026-03-02 12:25:02

|

472人浏览过

|

来源于php中文网

原创

适配器模式是解决接口不匹配的胶水层,用于不修改旧代码、不重写新逻辑时连接双方;必须使用场景包括第三方库、遗留模块与新dto不兼容、异步接口类型不一致等;核心标准是一方接口不可变且调用契约已定死。

什么是适配器模式 (adapter)_让不兼容的接口协同工作

适配器模式不是“加功能”,而是“接上就能用”——它解决的是已有代码和新需求之间接口对不上时,不改旧代码、不重写新逻辑,靠一个薄层把两边连通的问题。

什么时候必须写 Adapter 而不是直接调用?

当你看到这类信号,就该停手、建适配器,而不是硬塞 if-else 或强行改造原类:

  • 第三方库的类(比如 ThirdPartyPayment)你没法改源码,但它方法名是 make_payment(amount, currency),而你的业务层只认 pay(amount_in_yuan)
  • 遗留模块返回的是 Map<string object></string>,但新 service 需要 UserInfoDTO,且 DTO 字段命名/类型/嵌套结构都不同
  • 测试中想 mock 一个外部 HTTP 客户端,但它的接口是泛型回调式(executeAsync(Request, Consumer<response>)</response>),而你统一用的是 CompletableFuture<response></response>

核心判断标准:一方接口固定不可动,另一方调用契约已定死,中间没有“商量余地”。这时 Adapter 就是唯一的胶水。

对象适配器比类适配器更安全,但别盲目组合

Java/C# 中优先选对象适配器(组合),不是因为它“高级”,而是因为:

志设AI
志设AI

志设AI是一站式AI设计平台,集“AI生图 + 在线设计 + 素材交易 + 收益分成”于一体。

下载
  • 类适配器依赖多重继承(如 class MediaAdapter extends AdvancedMediaPlayer implements MediaPlayer),Java 不支持,C# 也不允许多继承 class
  • 组合能复用同一个 Adaptee 实例给多个 Adapter,比如一个 VlcPlayer 可同时被音频播放器和视频转码服务复用
  • 但注意:如果 Adaptee 构造开销大(比如初始化连接池、加载配置文件),而你每次 new Adapter 都 new 一次 Adaptee,就会造成资源浪费

实操建议:Adapter 的构造参数应明确接收已创建好的 Adaptee 实例,而非在内部 new —— 这既是解耦,也是控制生命周期。

Adapter 里最容易漏掉的三件事

写完编译通过、跑通一个 case 就提交?大概率埋雷:

  • 空值没兜底:被适配方法可能返回 null,而目标接口契约要求非空(比如 String getId()),Adapter 必须主动判空抛 IllegalArgumentException 或返回默认值,不能让空指针穿透过去
  • 异常没转换:Adaptee 抛的是 IOException,Target 接口声明 throws BusinessException,Adapter 必须 catch 并 rethrow,否则编译失败或运行时崩
  • 线程不安全没声明:如果 Adaptee 是无状态的(如纯函数工具类),Adapter 可安全共享;但如果它内部持有了 SimpleDateFormat 或缓存 map,Adapter 就得加同步或注明“非线程安全”,否则高并发下数据错乱

这些不是“可选优化”,是 Adapter 合格线——它对外代表的是 Target 接口,所有契约责任,都由它承担。

真正难的从来不是写一个 Adapter 类,而是判断哪一层该切、哪一层不该切;以及当 Adaptee 自身也开始演化(比如第三方库升级后加了新方法),Adapter 是否该跟着变,还是该用装饰器再包一层。边界模糊时,先看调用方是否感知变化——不感知,就是 Adapter 该做的事。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

249

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

967

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

839

2023.08.22

java多继承如何实现
java多继承如何实现

本专题整合了java多继承相关内容以及教程,阅读专题下面的文章了解更多详细内容。

34

2025.10.28

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1732

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

549

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2338

2025.12.29

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号