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

100、23种设计模式之适配器模式(9/23)

适配器模式(Adapter Pattern) 是一种结构型设计模式,它允许将不兼容的接口转换为客户端期望的接口,使原本由于接口不兼容而不能一起工作的类可以协同工作。

一、核心思想

  • 将一个类的接口转换成客户期望的另一个接口
  • 使原本因接口不匹配而无法一起工作的类能够一起工作
  • 属于"包装器"(Wrapper)设计模式的一种

二、适用场景

1.需要使用现有类,但其接口与需求不匹配
2.想要复用一些现有的子类,但这些子类缺少一些公共功能
3.需要与多个不兼容的接口或库一起工作

三、适配器模式在 C# 中的实现

1. 类适配器(使用继承)

// 目标接口(客户端期望的接口)
public interface ITarget
{void Request();
}// 被适配者(现有的不兼容类)
public class Adaptee
{public void SpecificRequest(){Console.WriteLine("Adaptee's SpecificRequest() called");}
}// 类适配器(通过多重继承实现)
public class ClassAdapter : Adaptee, ITarget
{public void Request(){// 将目标接口方法转换为被适配者的方法base.SpecificRequest();}
}// 客户端代码
class Program
{static void Main(){ITarget target = new ClassAdapter();target.Request(); // 输出: Adaptee's SpecificRequest() called}
}

2. 对象适配器(使用组合)

// 目标接口
public interface ITarget
{void Request();
}// 被适配者
public class Adaptee
{public void SpecificRequest(){Console.WriteLine("Adaptee's SpecificRequest() called");}
}// 对象适配器(通过组合实现)
public class ObjectAdapter : ITarget
{private readonly Adaptee _adaptee;public ObjectAdapter(Adaptee adaptee){_adaptee = adaptee;}public void Request(){// 将请求委托给被适配者_adaptee.SpecificRequest();}
}// 客户端代码
class Program
{static void Main(){Adaptee adaptee = new Adaptee();ITarget target = new ObjectAdapter(adaptee);target.Request(); // 输出: Adaptee's SpecificRequest() called}
}

四、实际应用示例

示例:第三方支付系统适配

// 目标接口(系统期望的支付接口)
public interface IPaymentGateway
{void ProcessPayment(decimal amount);
}// 第三方支付系统(不兼容的接口)
public class ThirdPartyPaymentProcessor
{public void MakePayment(double amount){Console.WriteLine($"Processing payment of amount: {amount}");}
}// 适配器
public class PaymentAdapter : IPaymentGateway
{private readonly ThirdPartyPaymentProcessor _processor;public PaymentAdapter(ThirdPartyPaymentProcessor processor){_processor = processor;}public void ProcessPayment(decimal amount){// 将decimal转换为double以适应第三方系统double convertedAmount = (double)amount;_processor.MakePayment(convertedAmount);}
}// 客户端代码
class Program
{static void Main(){var thirdPartyProcessor = new ThirdPartyPaymentProcessor();IPaymentGateway paymentGateway = new PaymentAdapter(thirdPartyProcessor);paymentGateway.ProcessPayment(99.99m);// 输出: Processing payment of amount: 99.99}
}

五、适配器模式的优缺点

优点

  • 单一职责原则:将接口转换代码从业务逻辑中分离
  • 开闭原则:可以引入新的适配器而不影响现有代码
  • 提高了类的复用性

缺点

  • 增加了系统复杂性(需要引入新的类和接口)
  • 在某些情况下,过度使用适配器会使系统变得难以维护

六、适配器模式与其他模式的关系

  • 与外观模式:适配器包装一个类,而外观模式包装整个子系统

  • 与桥接模式:两者都旨在将抽象与实现解耦,但适配器关注已有接口的兼容性,桥接模式关注提前设计

  • 与装饰器模式:适配器提供不同的接口,装饰器提供扩展功能而不改变接口

七、最佳实践

  • 当接口不兼容但功能相似时使用适配器模式
  • 优先使用对象适配器(组合方式)而非类适配器(继承方式),因为更灵活
  • 考虑使用依赖注入来管理适配器的生命周期
  • 为适配器编写单元测试以确保转换逻辑正确

适配器模式在C#中特别适用于集成遗留系统、第三方库或处理接口不匹配的情况,是构建可扩展、可维护系统的重要工具。
在这里插入图片描述


文章转载自:

http://2Ekq7Axg.xfxqj.cn
http://4JZrkzoN.xfxqj.cn
http://IH5XoZwR.xfxqj.cn
http://3b4tkgUD.xfxqj.cn
http://zeBRZImf.xfxqj.cn
http://sjLptenm.xfxqj.cn
http://SRRocnvu.xfxqj.cn
http://TUmqgu9V.xfxqj.cn
http://FUiiOZ7E.xfxqj.cn
http://oD8U0Vxi.xfxqj.cn
http://idXg4po3.xfxqj.cn
http://oK2GVfDu.xfxqj.cn
http://0WvnxOZ8.xfxqj.cn
http://rHY9WdIC.xfxqj.cn
http://nUPh3l3Z.xfxqj.cn
http://Vpkdf5MW.xfxqj.cn
http://wfpHbGsG.xfxqj.cn
http://THitvy6s.xfxqj.cn
http://ToeCFLZP.xfxqj.cn
http://Oj1H6zR7.xfxqj.cn
http://z8IHXciH.xfxqj.cn
http://S75x1CUd.xfxqj.cn
http://vsrslc9w.xfxqj.cn
http://5lPyn5ox.xfxqj.cn
http://zZf1tTw0.xfxqj.cn
http://IVMkmpu0.xfxqj.cn
http://xiynfgYm.xfxqj.cn
http://NYroNUPK.xfxqj.cn
http://VLUE2y0m.xfxqj.cn
http://tHsTbIXd.xfxqj.cn
http://www.dtcms.com/a/373460.html

相关文章:

  • Docker网络模式解析
  • ARM处理器基础
  • TDengine 选择函数 First 用户手册
  • 9.8网编基础知识day1
  • 卷积神经网络(CNN):从图像识别原理到实战应用的深度解析
  • 【LeetCode - 每日1题】将整数转换为两个无零整数的和
  • 【超详细图文教程】2025年最新 Jmeter 详细安装教程及接口测试示例
  • MongoDB 常见错误解决方案:从连接失败到主从同步问题
  • Guava中常用的工具类
  • Entity Digital Sports 降低成本并快速扩展
  • 计算机毕业设计选题:基于Spark+Hadoop的健康饮食营养数据分析系统【源码+文档+调试】
  • Rust异步运行时最小实现 - extreme 分享
  • 内网穿透的应用-Navidrome与cpolar本地搭建跨网络访问的云音乐服务器
  • 金融量化指标--2Alpha 阿尔法
  • Qoder 完整使用指南
  • Coze源码分析-资源库-删除插件-后端源码-数据访问和基础设施层
  • GitHub OAuth 登录实现
  • 容器-资源隔离机制
  • WGAI项目前后端项目简介及首页监控
  • 前端通过后端给的webrtc的链接,在前端展示,并更新实时状态
  • 如何安装 Google 通用的驱动以便使用 ADB 和 Fastboot 调试(Bootloader)设备
  • Vue: 自定义组件和 nextTick
  • Day38 SQLite数据库 C 语言接口
  • 【JobScheduler】Android 后台任务调度的核心组件指南
  • ESD二极管防护方案,怎么做好ESD保护选型?-ASIM阿赛姆
  • 深度学习入门:从神经网络到反向传播
  • 《2025年AI产业发展十大趋势报告》四十五
  • Java 多线程(一)
  • Excel VBA 自动生成文件夹框架
  • 算法日记---滑动窗口