当前位置: 首页 > news >正文

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();

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

http://www.jsqmd.com/news/1305677/

相关文章:

  • 复合调味料定制哪家推荐? - 中媒介
  • 大疆嵌入式面试核心考点深度解析:STM32、RTOS、Linux与C++实战指南
  • 自贡房屋漏水怎么办?全城靠谱房屋修缮团队汇总,解决季节性渗漏难题 - 宅安选房屋修缮
  • 从AAAS新院士看科研趋势:交叉融合、工具驱动与人才培养
  • AI 陪伴成消费新趋势,陪伴机器人2026年或迎窗口期,谁能建立长期关系资产?
  • 求推荐适合装修团队的高性价比装修基材采购渠道 - 中媒介
  • 麻辣烫选址哪家效果好? - 中媒介
  • Beyond Compare授权问题解决方案:正版购买、评估期重置与开源替代
  • 植物饮料哪家专业? - 中媒介
  • 树莓派新手入门:从零开始搭建微型计算机的保姆级教程
  • DLSS Swapper架构解析:游戏性能优化库的模块化设计与实现
  • 节日送礼酒哪家效果好? - 中媒介
  • 精准双向计量的智能电表怎么选? - 中媒介
  • Vivado时序收敛实战:从违例分析到代码优化的FPGA设计指南
  • 邢台市卫生间漏水怎么处理_2026冀南太行山东麓漏水维修流程教程与推荐 - 雨婺虹房屋维修
  • 电赛H题实战:从核心算法验证到嵌入式系统稳定性优化
  • Python列表索引错误:TypeError: list indices must be integers or slices, not str 深度解析与解决方案
  • 微信小程序TabBar深度自定义:从基础配置到动态权限与性能优化
  • 安徽性价比高的室外羽毛球供应商推荐哪几家? - 中媒介
  • 7月AIOps完整复盘:310篇文章覆盖的五大技术主题核心方法论与知识体系全景图
  • 深圳潮玩运动中心哪家专业? - 中媒介
  • 管理体系完整胶带企业哪家专业? - 中媒介
  • 杭州餐饮培训哪家推荐? - 中媒介
  • AI大模型应用开发实战:从LangChain、RAG到Agent的完整指南
  • 电赛控制题制胜心法:从PID调参到工程化系统构建
  • 发电机哪家好? - 中媒介
  • 大理野生菌火锅哪家菌子适合游客推荐? - 中媒介
  • MyBatis框架核心优势与应用实践解析
  • 接了个多端外包私活,我用这款AI应用开发工具3小时搞定原型(附实操体验)
  • DoS 攻击下孤岛微电网混合动态事件触发分布式二次弹性协同控制(Simulink仿真实现)