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://www.pswp.cn/diannao/98478.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线上环境CPU使用率飙升,如何排查

线上环境CPU使用率飙升,如何排查 1.CPU飙升的常见原因 1. 代码层面问题 死循环:错误的循环条件导致无限循环递归过深:没有正确的终止条件算法效率低:O(n)或更高时间复杂度的算法处理大数据集频繁GC:内存泄漏导致频繁垃…

《sklearn机器学习——特征提取》

在 sklearn.feature_extraction 模块中,DictVectorizer 是从字典(dict)中加载和提取特征的核心工具。它主要用于将包含特征名称和值的 Python 字典列表转换为机器学习算法所需的数值型数组或稀疏矩阵。 这种方法在处理结构化数据(…

IEEE出版,限时早鸟优惠!|2025年智能制造、机器人与自动化国际学术会议 (IMRA 2025)

2025年智能制造、机器人与自动化国际学术会议 (IMRA2025)2025 International Conference on Intelligent Manufacturing, Robotics, and Automation中国▪湛江2025年11月14日-2025年11月16日IMRA2025权威出版大咖云集稳定检索智能制造、人工智能、机器人、物联网(Io…

C# 基于halcon的视觉工作流-章30-圆圆距离测量

C# 基于halcon的视觉工作流-章30-圆圆距离测量 本章目标: 一、利用圆卡尺找两圆心; 二、distance_pp算子计算两圆点距离; 三、匹配批量计算;本章是在章23-圆查找的基础上进行测量使用,圆查找知识请阅读章23&#xff0c…

java设计模式二、工厂

概述 工厂方法模式是一种常用的创建型设计模式,它通过将对象的创建过程封装在工厂类中,实现了创建与使用的分离。这种模式不仅提高了代码的复用性,还增强了系统的灵活性和可扩展性。本文将详细介绍工厂方法模式的三种形式:简单工厂…

Ubuntu 24.04 中 nvm 安装 Node 权限问题解决

个人博客地址:Ubuntu 24.04 中 nvm 安装 Node 权限问题解决 | 一张假钞的真实世界 参考nvm的一个issue:https://github.com/nvm-sh/nvm/issues/3363 异常信息如下: $ nvm install 22 Downloading and installing node v22.19.0... Download…

Java面试-线程安全篇

一、synchronized关键字: 基本使用与作用:通过抢票代码示例,展示了synchronized作为对象锁,可避免多线程超卖或抢到同一张票问题,保证代码原子性,同一时刻只有一个线程获得锁,其他线程阻塞。底层…

R 语言科研绘图 --- 其他绘图-汇总2

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…

【数学建模学习笔记】启发式算法:粒子群算法

零基础小白看懂粒子群优化算法(PSO)一、什么是粒子群优化算法?简单说,粒子群优化算法(PSO)是一种模拟鸟群 / 鱼群觅食的智能算法。想象一群鸟在找食物:每只鸟(叫 “粒子”&#xff0…

【Gitlab】Ubuntu 20.04服务器部署Gitlab

写一个 适用于 Ubuntu 20.04/22.04 的 GitLab 一键部署脚本,包括:安装依赖安装 GitLab CE配置公网 IP 或域名自动开启 HTTPS(Let’s Encrypt)配置防火墙下面是完整脚本:#!/bin/bash# # GitLab 一键安装脚本 # # 1. 检…

Android 15重磅升级:16KB内存页机制详解与适配指南

一、背景随着Android硬件架构的持续演进,新一代设备开始采用16KB内存页(Page Size)机制,逐步替代传统的4KB内存页设计。此项底层变更对应用兼容性产生直接影响,特别是对依赖Native层库、JNI接口或自定义内存管理模块的…

Mybatis-8 动态SQL

动态SQL-官方文档 文档地址 动态 SQL_MyBatis中文网 为什么需要动态SQL 1、动态SQL是MyBatis的强大特性之一 2、使用JDBC或其它类似的框架,根据不同条件拼接SQL语句非常麻烦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一…

PySpark数据输入

PySpark数据输入 1.理解RDD对象 2.掌握PySpark数据输入的2种方法 RDD对象 PySpark支持多种数据的输入,在输入完成后,都会得到一个:RDD类的对象 RDD全称为:弹性分布式数据集(Resilient Distributed Datasets&#xff09…

【系统架构设计(16)】软件架构设计二:软件架构风格:构建系统的设计模式与选择指南

文章目录一、核心思想二、数据流风格:以数据流动为核心的处理模式三、调用返回风格:基于程序调用的层次化组织四、独立构件风格:基于事件驱动的松耦合架构五、虚拟机风格:提供抽象执行环境的架构模式六、仓库风格:以数…

MySQL速记小册(1)

1【Q】:Mysql中的数据排序是怎么实现的?【A】:排序过程中如果字段有索引,则利用索引排序。反之使用文件排序。在文件排序中,如果数据量少则在内存中排序,使用单路排序或双路排序。如果数据量大则利于磁盘文…

20250904 10:45_排查10.1.3.35新QMS系统RMAN备份失败问题(优化脚本里的环境配置,增加了check_oracle_env 函数)

一、RMAN备份失败日志如下 [2025-09-04 04:00:01] 备份脚本启动 [2025-09-04 04:00:01] 开始 RMAN 备份 CDB: ORCLCDB Message file RMAN<lang>.msb not found Verify that ORACLE_HOME is set properly [2025-09-04 04:00:01] RMAN 备份失败! 二、原备份脚本存档…

Vue3源码reactivity响应式篇之EffectScope

概述 EffectScope是Vue3中一个响应式系统的辅助类&#xff0c;用于管理副作用&#xff08;effect&#xff09;的作用域。它可以帮助我们更好地组织和管理多个effect&#xff0c;便于一起停止或暂停以及恢复&#xff0c;避免了全局状态的污染和管理的复杂性。 每一个vue组件的实…

MySQL 日志全解析:Binlog/Redo/Undo 等 5 类关键日志的配置、作用与最佳实践

1 二进制日志&#xff08;Binlog&#xff09;&#xff1a;配置与核心作用 Binlog 是 MySQL 中跨存储引擎的核心日志&#xff0c;记录所有数据修改操作&#xff0c;主要用于主从复制、数据备份恢复与跨库迁移。 1.1 Binlog 核心操作 开启 Binlog 若需开启 Binlog&#xff0c;需在…

springboot 之 HTML与图片生成 (2)

前言 之前写了一篇html转图片的 文章&#xff0c;使用中文时会出现乱码情况&#xff0c;后来又从网上找了下信息&#xff0c;这篇主要介绍下另一个转换库。 依赖 <!-- 用于将html转图片--><dependency><groupId>gui.ava</groupId><artifactId>…

计算机组成原理:计算机的分类

&#x1f4cc;目录&#x1f5a5;️ 计算机组成原理&#xff1a;计算机的分类——从架构到应用的全景梳理一、按处理数据类型分类&#xff1a;从“数字”到“混合”的演进&#xff08;一&#xff09;数字计算机&#xff1a;离散数据的“精准管家”1. 核心原理2. 关键优势3. 典型…