news 2026/8/1 8:05:57

GoF设计模式——适配器模式

作者头像

张小明

前端开发工程师

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

h5打开以查看

为什么需要适配器模式?

写业务代码时经常碰到这种情况:项目里已经定义好了一个接口 PaymentGateway,所有支付都走它的 pay(orderId, amount) 方法;今天产品说要接入微信支付,打开 SDK 一看——微信用的是 unifiedOrder(body, outTradeNo, totalFee, ip),参数和方法名跟系统的接口对不上。

// 系统希望的调用方式 paymentGateway.pay("ORD001", new BigDecimal("99.9")); // 但微信 SDK 实际上长这样 wxPayApi.unifiedOrder("商品", "ORD001", 9990, "127.0.0.1"); // 单位是分

两种选择:把订单模块全部改成直接调微信 SDK,或者改微信 SDK 让它实现 PaymentGateway——前者一旦切换支付渠道就要重写业务代码,后者根本动不了第三方 SDK 的源码。

这种"现有的类"和"需要的接口"对不上的矛盾,就是适配器模式要解决的问题。

概念

适配器模式(Adapter Pattern)是一种结构型设计模式,核心思想是将一个类的接口转换成客户端期望的另一个接口,让原本不兼容的类能够协同工作。

适配器模式包含三个角色:

  • Target(目标接口):客户端期望使用的接口
  • Adapter(适配器):实现目标接口,内部持有被适配者,把目标接口的调用转换为被适配者的调用
  • Adaptee(被适配者):已有的类,其接口与目标接口不兼容,但功能正好是需要的

Adapter 实现 Target 接口并持有 Adaptee 实例,Client 只依赖 Target,完全不感知 Adaptee 的存在。Adapter 内部把 request() 翻译成 specificRequest(),参数和返回值的差异都在适配器里处理。

可以把适配器理解为电源转换头:新装的墙面插座只有两孔(系统期望的接口),家里的老电器是三脚插头(已有的、改不了的类),中间塞一个两脚转三脚的转换头——插座只看到两脚,老电器照样能用,"翻译"工作全在转换头内部完成。这个比喻贯穿后面的实现章节,方便对照理解。

实现

适配器模式有两种实现方式:对象适配器(组合)和类适配器(继承)。前者是 GoF 推荐方式,也是实际开发中最常用的;后者由于 Java 单继承限制,使用场景有限。

对象适配器

对象适配器通过组合实现:适配器实现目标接口,内部持有被适配者的引用,将调用委托给被适配者。

// 目标接口 public interface Target { public void request(); } // 被适配者 public class Adaptee { public void specificRequest() { System.out.println("Adaptee 的特定请求"); } } // 对象适配器:组合持有被适配者 public class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void request() { adaptee.specificRequest(); } } // 客户端 Target target = new Adapter(new Adaptee()); target.request();

引入一个例子:「家里的两孔插座,要给一台三脚插头的老电器供电,买一个两脚转三脚的电源转换头,一头插进插座、

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 7:58:47

Java IO 与 NIO、AIO 区别,Netty 为什么在网络框架中脱颖而出

Java IO 与 NIO、AIO 区别,Netty 为什么在网络框架中脱颖而出“BIO 是阻塞的,NIO 是多路复用,AIO 是异步……”这句话,很多 Java 程序员都能背。但真要问:NIO 的“多路复用”到底复用了什么?AIO 为什么在 L…

作者头像 李华
网站建设 2026/8/1 7:53:48

天赐范式第121天:干预实验的前置条件审查——施工图上的四个缺口

天赐范式第121天(第二篇):干预实验的前置条件审查——施工图上的四个缺口摘要:第121天第一篇给出了RBM干预实验的技术规范草案——结构干预、稀疏扰动、硬阈值判定。但草案不是蓝图,蓝图上的每一个参数都需要前置条件支…

作者头像 李华
网站建设 2026/8/1 7:52:30

Listwise排序损失函数详解:从ListNet到ListMLE的原理与实现

1. 项目概述:从“排序”到“列表”的思维跃迁 在信息检索、推荐系统乃至广告点击率预估这些我们每天都会接触到的场景背后,有一个核心问题始终在驱动着模型的进化:如何让机器学会“排序”?早期,我们习惯于将排序问题转…

作者头像 李华