设计模式-结构型-适配器模式

news2025/1/10 5:34:19

在软件开发中,随着系统的不断扩展和模块的不断增加,往往会遇到不同模块之间接口不兼容的情况。此时,如果我们能通过某种方式将一个接口转化为另一个接口,那么开发工作将变得更加灵活和高效。适配器模式(Adapter Pattern)正是为了解决这个问题而设计的,它能够让两个不兼容的接口能够协同工作。

本文将深入解析适配器模式的概念、应用场景、实现方法,并通过代码示例帮助大家理解如何在实际开发中使用适配器模式。


1. 适配器模式简介

适配器模式属于结构型模式,它通过将一个类的接口转换为客户端所期待的另一个接口,使得原本接口不兼容的类可以一起工作。

定义

适配器模式(Adapter Pattern)是通过“适配器类”对两个接口进行转换,从而使得不兼容的接口能够正常交互和工作。简单来说,它充当了一个桥梁,使得接口不匹配的类能够协同工作。


2. 适配器模式的结构

适配器模式主要包含以下几个部分:

  • 目标接口(Target):客户端所需要的接口,它是适配器模式的核心。
  • 源接口(Adaptee):需要被适配的现有接口。这个接口与目标接口不兼容,需要通过适配器进行转换。
  • 适配器(Adapter):适配器实现了目标接口,调用源接口的相关方法,以达到兼容的效果。

UML 图示

图像来源

 
  • Client:客户端,调用目标接口的代码。
  • Target:目标接口,客户端期待的接口。
  • Adapter:适配器类,适配源接口(Adaptee)到目标接口(Target)。
  • Adaptee:源接口,原有的不兼容接口。

3. 适配器模式的类型

适配器模式可以分为两种常见的类型,具体选择哪种取决于应用场景:

3.1 类适配器模式(Class Adapter)

类适配器通过继承源类(Adaptee)来实现目标接口(Target)。在类适配器中,适配器通过继承的方式来实现接口的适配。

3.2 对象适配器模式(Object Adapter)

对象适配器通过组合(而非继承)来实现目标接口,适配器将源对象作为成员变量,并通过调用源对象的方法来完成适配。这种方式更加灵活,因为它不依赖于类的继承关系。


4. 适配器模式的应用场景

适配器模式通常用于以下几种情况:

  1. 需要复用现有类的功能,但接口不兼容时: 如果已有的类或者模块接口与当前系统中的接口不兼容,可以使用适配器模式来进行适配。

  2. 系统中多个类需要转换成统一接口时: 如果系统中有多个类,客户端希望统一调用它们的接口,而这些类的接口不同,可以通过适配器模式进行统一适配。

  3. 第三方库的接口与系统不兼容时: 在集成第三方库时,库的接口可能与现有系统的接口不匹配,适配器模式可以帮助进行接口转换。


5. 适配器模式的优缺点

优点

  • 解耦:通过适配器模式,客户端和原有接口之间的耦合度降低,客户端不再依赖于源接口的实现细节。
  • 提高兼容性:适配器模式使得两个不兼容的接口能够协同工作,扩展性好。
  • 代码复用性强:可以将已有类的功能复用到新的接口上,避免重复代码。

缺点

  • 增加系统复杂性:由于引入了适配器类,可能会增加代码的复杂度,导致系统结构变得更加复杂。
  • 性能开销:适配器模式需要额外的对象包装和转换,可能会导致一定的性能开销。

6. 适配器模式的实现

6.1 示例:类适配器模式

假设我们有一个需求,需要将一个旧的类(OldSystem)的接口适配到新的系统接口(TargetSystem)中。我们通过继承的方式来实现适配。

# 目标接口
class TargetSystem:
    def request(self):
        pass

# 源接口
class OldSystem:
    def specific_request(self):
        return "Old system request"

# 类适配器:继承源接口,适配成目标接口
class Adapter(TargetSystem, OldSystem):
    def request(self):
        # 调用源接口的方法,并将其适配为目标接口
        return self.specific_request()

# 客户端代码
if __name__ == "__main__":
    target = Adapter()
    print(target.request())  # 输出:Old system request
解释:
  • TargetSystem 是客户端期望的目标接口。
  • OldSystem 是现有的接口,它的方法是 specific_request,客户端不直接兼容。
  • Adapter 继承了 TargetSystemOldSystem,并实现了目标接口的 request 方法,将其适配为源接口的方法 specific_request

6.2 示例:对象适配器模式

在对象适配器模式中,我们不通过继承,而是通过组合将源对象与目标接口适配。

# 目标接口
class TargetSystem:
    def request(self):
        pass

# 源接口
class OldSystem:
    def specific_request(self):
        return "Old system request"

# 对象适配器:通过组合的方式适配
class Adapter(TargetSystem):
    def __init__(self, old_system: OldSystem):
        self.old_system = old_system  # 组合OldSystem实例

    def request(self):
        # 调用源接口的方法,将其适配为目标接口
        return self.old_system.specific_request()

# 客户端代码
if __name__ == "__main__":
    old_system = OldSystem()
    target = Adapter(old_system)
    print(target.request())  # 输出:Old system request
解释:
  • TargetSystem 是目标接口,客户端期望调用的接口。
  • OldSystem 是已有的源接口,无法直接满足目标接口。
  • Adapter 类通过组合 OldSystem 的实例来实现目标接口。

7. 适配器模式的总结

适配器模式是一个非常实用的设计模式,它通过将不兼容的接口转换为目标接口,帮助我们解决系统中不同模块或类之间接口不一致的问题。无论是类适配器模式还是对象适配器模式,都能够使得不同接口的类能够一起工作,提高代码的复用性、灵活性和扩展性。

适配器模式的核心优势

  • 解决接口不兼容问题。
  • 保持原有系统的可扩展性和复用性。
  • 降低系统之间的耦合度。

适配器模式的应用场景

  • 接口不兼容时需要进行转换。
  • 在软件开发中集成第三方库时,常常需要进行接口适配。
  • 系统需要统一多个接口时,适配器模式非常适用。

希望通过本文的介绍,能够帮助你更好地理解适配器模式,并能够在实际开发中灵活使用它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274164.html

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

相关文章

MT6835天玑6100平台规格参数_MTK联发科安卓核心板方案定制开发

联发科MT6835平台集成了蓝牙、FM、WLAN 和 GPS 模块,是一个高度集成的基带平台。该芯片集成了两个 Arm Cortex-A76 内核(运行频率高达 2.2GHz)、六个 Arm Cortex-A55 内核(运行频率高达 2.0 GHz)和强大的多标准视频编解…

认识+安装ElasticSearch

1. 为什么要学习ElasticSearch? 一般的来说,项目中的搜索功能尤其是电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的,存在很多问题。 1.1 数据库搜索所存在的问题 1.1.1 查询效率较低 由于数据库模糊查询不走索引&…

QPS和TPS 的区别是什么?QPS 大了会有什么问题,怎么解决?

QPS 和 TPS 的区别是什么?QPS 大了会有什么问题,怎么解决? QPS(Queries Per Second)和 TPS(Transactions Per Second)都是衡量系统性能的重要指标,尤其是在 Web 服务、数据库和分布…

Mac中配置vscode(第一期:python开发)

1、终端中安装 xcode-select --install #mac的终端中安装该开发工具 xcode-select -p #显示当前 Xcode 命令行工具的安装路径注意:xcode-select --install是在 macOS 上安装命令行开发工具(Command Line Tools)的关键命令。安装的主要组件包括:C/C 编…

【网络协议】静态路由详解

网络中的路由器通过以下两种方式之一发现远程网络: 静态配置路由动态路由协议 在本文,我们将学习关于静态路由的各种概念,例如如何配置静态路由、路由表如何进行决策、路由接口等相关知识。 文章目录 引言直连网络静态路由路由表原则原则1原…

【杂记】qt

1、终端下载PySide6以转换文件格式:pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple 命令提示符下载完毕后:powerShell :cd 跳转到文件对应地址 (1、pyside6-uic.exe test.ui -o test.py #将Ui界面文件转换成…

【C#】C# 使用onnxruntime报错记录

1、 C#使用onnxruntime时报CUDA版本错误 Bug信息:The given version [14] is not supported, only version 1 to 10 is supported in this build. 导致这个bug的原因是,在win11系统下的windows/system32文件夹下有一个默认的onnxruntime.dll,…

LabVIEW计算机软件著作权

计算机软件著作权是指软件开发者对其创作的软件作品享有的法律保护权利,目的是防止他人未经授权复制、修改或传播该软件。软件著作权不仅包括软件的源代码,还包括文档、界面设计、功能模块、程序逻辑等内容。通过登记软件著作权,开发者可以获…

(2023|NIPS,LLaVA-Med,生物医学 VLM,GPT-4 生成自指导指令跟随数据集,数据对齐,指令调优)

LLaVA-Med: Training a Large Language-and-Vision Assistant for Biomedicine in One Day 目录 LLaVA-Med: Training a Large Language-and-Vision Assistant for Biomedicine in One Day 0. 摘要 1. 简介 2. 相关工作 3. 生物医学视觉指令数据 4. 将多模态对话模型适配…

【网络】计算机网络的分类 局域网 (LAN) 广域网 (WAN) 城域网 (MAN)个域网(PAN)

局域网是通过路由器接入广域网的 分布范围 局域网Local Area Network:小范围覆盖,速度高,延迟低(办公室,家庭,校园,网络) 广域网Wide Area Network 大范围覆盖,速度相对低,延迟高…

LabVIEW软件Bug的定义与修改

在LabVIEW软件开发过程中,bug(程序错误或缺陷)指的是程序中导致不符合预期行为的任何问题。Bug可能是由于编码错误、逻辑漏洞、硬件兼容性问题、系统资源限制等因素引起的。它可能会导致程序崩溃、功能无法正常执行或输出结果不符合预期。理解…

【Logstash03】企业级日志分析系统ELK之Logstash 过滤 Filter 插件

Logstash 过滤 Filter 插件 数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构, 并将它们转换成通用格式,以便进行更强大的分析和实现商业价值。 Logstash 能够动态地转换和解析数据&a…

Docker运维高级容器技术知识点总结

1、虚拟机部署和容器化部署的区别是什么&#xff1f; 1、技术基础&#xff1a; <1>.虚拟化技术在物理硬件上创建虚拟机&#xff0c;每台虚拟机运行自己完整的操作系统、从而实现资源隔离。 <2>.容器化技术&#xff1a;将应用程序打包在容器内&#xff0c;在进程空间…

1.2.1-2部分数据结构的说明02_链表

&#xff08;1&#xff09;链表数据结构&#xff1a; 概念&#xff1a; 将列表中相互连接的节点不连续的存储在内存中。与数据不同&#xff0c;我们无法再恒定时间内访问任何元组&#xff0c;如果遍历所有则花费时间与元素总数n成正比。插入和删除1个元素的时间复杂度都是O(n…

C# 之某度协议登录,JS逆向,手机号绑定,获取CK

.NET兼职社区 .NET兼职社区 .NET兼职社区 .NET兼职社区 有需要指导&#xff0c;请私信我留言V或者去社区找客服。

SpringcloudAlibaba黑马笔记(部分)

第一章 微服务介绍 1.1 系统架构演变 随着互联网的发展&#xff0c;网站应用的规模也在不断的扩大&#xff0c;进而导致系统架构也在不断的进行变化。 从互联网早起到现在&#xff0c;系统架构大体经历了下面几个过程 : 单体应用架构 ---> 垂直应用架构 ---> 分布 …

Redis 基础篇

一、redis 概念及特性 1.1 Redis 概念 Redis&#xff08;Remote Dictionary Server&#xff09;&#xff0c;即远程字典服务&#xff0c;是一个开源的高性能键值存储数据库&#xff0c;可以用作数据库、缓存和消息中间件。 redis 官网&#xff1a;Redis - The Real-time Data P…

DAY15 神经网络的参数和变量

DAY15 神经网络的参数和变量 一、参数和变量 在神经网络中&#xff0c;参数和变量是两个关键概念&#xff0c;它们分别指代不同类型的数据和设置。 参数&#xff08;Parameters&#xff09; 定义&#xff1a;参数是指在训练过程中学习到的模型内部变量&#xff0c;这些变量…

[离线数仓] 总结二、Hive数仓分层开发

接 [离线数仓] 总结一、数据采集 5.8 数仓开发之ODS层 ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比率,较高的,此处选择gzip。 CompressedStorage - Apache Hive - Apac…

Chromium源码windows下载和编译

官方地址&#xff1a;chromium/docs/windows_build_instructions.md at main chromium/chromium GitHub Chromium介绍 Chromium 是一个开源浏览器项目&#xff0c;旨在为所有用户构建更安全、更快、更稳定的网络体验方式。掌握Chromium的编译和开发是浏览器项目相关的开发者…