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

Java结构型设计模式-适配器模式 适配器设计模式是一种结构型模式,允许将现有类的接口用作另一个接口。它充当两个不兼容接口之间的桥梁,使它们协同工作。此模式涉及一个称为适配器的类,该类负责连接独立或不兼容接口的功能。让我们用一个简单的例子来理解这个概念:假设你有两个朋友,一个只会说英语,另一个只会说法语。你想让他们交流,但存在语言障碍。你充当一个适配器,在他们之间翻译信息。你的角色允许英语使用者向你传达信息,而你则将这些信息转换为法语,供对方使用。这样,尽管语言不同,你的适应能够让你的朋友之间顺利交流。 阅读详情

一、结构型设计模式总览

结构型设计模式关注的是如何将对象和类组装成更大的结构,同时保持结构的灵活性和高效性。它们主要用于处理类与对象之间的组合关系,帮助构建更易维护、扩展和复用的系统架构。

七大经典结构型设计模式

模式名称核心思想概述
适配器模式(Adapter)提供中间层,让接口不兼容的对象能够协作
桥接模式(Bridge)将抽象与实现分离为两个独立层次,提高灵活性
组合模式(Composite)“组合优于继承”,动态组装程序类的功能,常用于树形结构
装饰器模式(Decorator)为对象动态添加新行为,通过封装扩展功能
外观模式(Facade)为复杂系统/库提供简单统一的接口,隐藏内部复杂性
享元模式(Flyweight)共享内存中的繁重部分,通过引用差异部分优化内存占用(高频用于游戏开发)
代理模式(Proxy)提供原始对象的替代品或占位符,控制访问并可能对请求进行预处理

二、适配器模式(Adapter Pattern)

1. 模式定义与核心目的

  • 适配器模式的核心是:提供一个中间层(适配器),让原本接口不兼容的对象能够在一起顺利协作。
  • 类比现实:就像电源适配器能让不同规格的插头插入插座一样,软件中的适配器能让不同接口的对象“互通有无”。

2. 游戏开发典型应用场景:多输入设备兼容

场景描述:

在游戏开发中,玩家可以使用多种输入设备操作游戏,例如:

  • 键盘(Keyboard)
  • 手柄(Gamepad / GamePad)

每种设备有自己独立的输入接口方法:

  • 键盘类调用:pressKey()
  • 手柄类调用:pressButton()

但如果游戏逻辑层直接调用这些具体设备的输入方法,就需要为每种设备编写独立且冗余的代码,缺乏统一性,难以维护和扩展。


3. 适配器模式的解决方案

(1)定义统一的目标接口(Target Interface)
class InputDevice {
public:
    virtual void input() = 0; // 统一的输入方法
};
  • 这是我们期望游戏逻辑层使用的统一接口,简单且与具体设备无关。
  • 目标接口通常是先于各种具体设备存在的,或者是在系统需要兼容新设备时重构引入的。
(2)存在多个原接口(Adaptee / 原有设备接口)
  • 键盘类:Keyboard,提供方法 pressKey()
  • 手柄类:Gamepad,提供方法 pressButton()

这些是原有的、接口不兼容的具体实现类,它们不能直接被游戏逻辑层统一调用。

(3)定义适配器类(Adapter)
  • 我们为每种输入设备创建一个适配器类:

    • KeyboardAdapter:继承自 InputDevice,内部包含一个 Keyboard 对象
    • GamepadAdapter:继承自 InputDevice,内部包含一个 Gamepad 对象
  • 适配器类的关键作用:

    • 在构造函数中保存具体的输入设备对象(如键盘或手柄)
    • 实现统一的 input() 方法,在方法内部调用具体设备的原始输入方法(如 pressKey() 或 pressButton())

适配器就像一个“翻译官”,把具体设备的“语言”(pressKey / pressButton)翻译成目标接口的“通用语言”(input())。

(4)客户端(游戏逻辑层)调用
  • 游戏逻辑层只依赖统一的 InputDevice 接口,不再关心具体是键盘还是手柄。
  • 在运行时,根据条件创建不同的适配器对象(如键盘适配器或手柄适配器),然后统一调用 input() 方法即可。

4. 适配器模式的关键构成要素总结

要素说明示例(输入设备场景)
目标接口(Target)客户端期望使用的统一接口,简单易用InputDevice 接口中的 input() 方法
原接口(Adaptee)需要被适配的原有对象接口,通常与目标接口不兼容Keyboard::pressKey() 和 Gamepad::pressButton()
适配器(Adapter)实现目标接口,内部持有原接口对象,负责将原接口方法转换为统一的目标接口方法KeyboardAdapter 和 GamepadAdapter

通过引入适配器,客户端代码与具体设备实现完全解耦,只需面向统一的接口编程,大大提高了系统的灵活性和可扩展性。


5. 适配器模式的典型应用拓展

除了输入设备的兼容外,适配器模式在游戏及工业开发中还有其他常见应用:

游戏策划表格数据兼容
  • 背景:游戏策划使用 CSV、JSON、XML 等格式的策划表格配置游戏数据(任务、技能、剧情等),这些表格可能随着版本迭代发生变化。
  • 问题:程序需要读取并解析这些不同格式的数据,而且每种格式的接口和结构可能差异较大。
  • 解决方案:为每种数据格式创建一个适配器,统一封装解析逻辑,对外提供一致的接口。这样,无论策划使用哪种格式的表格,程序都能通过适配器无缝读取数据,无需修改核心逻辑。

6. 适配器模式的优缺点分析

优点:
  1. 遵循单一职责原则:将接口转换的逻辑封装在适配器中,而不是分散在业务代码里。
  2. 符合开闭原则:当需要支持新的设备或数据格式时,只需添加新的适配器类,而无需修改现有代码。
  3. 提高系统灵活性与可扩展性:通过统一的接口,客户端代码可以轻松应对不同类型的对象,而无需关心其具体实现。
  4. 解耦客户端与具体实现:客户端只依赖目标接口,与具体设备或数据源实现完全隔离。
缺点:
  1. 引入额外类,增加代码复杂度:每增加一种新设备或格式,通常需要新增一个适配器类,可能导致类数量增多,代码层次变深。
  2. 可能过度设计:如果原接口之间的差异较小,或者可以通过简单抽象(如提取公共基类/接口)解决问题,那么引入适配器可能显得冗余。
  3. 性能开销(轻微):适配器模式通常涉及一层方法调用转发,在极端性能敏感场景下可能带来微小开销(但对大多数应用包括游戏来说影响极小)。

三、总结

适配器模式核心价值:

通过引入中间适配层,让接口不兼容的对象能够无缝协作,实现代码的解耦、复用与扩展。

适用场景:

  • 需要让多个不同接口的对象在同一个系统中协同工作(如多种输入设备、多种数据源)
  • 系统需要兼容旧有接口或第三方库,但又希望对外提供统一易用的接口
  • 未来可能频繁接入新类型对象,希望避免频繁修改现有代码

实际应用举例:

  • 游戏中的键盘、手柄、触摸屏等输入设备统一管理
  • 不同格式的策划数据表格(CSV/JSON/XML)解析适配
  • 第三方 SDK 或库的接口与项目内部逻辑的对接
别再踩坑了!CAPL脚本里局部变量和全局变量的那些“怪事”(附CANoe实测代码) 本文深度解析CAPL脚本中局部变量和全局变量的特殊机制,揭示其与通用编程语言的差异。通过实测代码展示静态局部变量的默认行为和全局变量的节点隔离特性,并提供高效避坑指南,帮助汽车网络测试工程师避免常见陷阱。 阅读详情

相关推荐

银河麒麟V10新特性解析:从安装到AI应用的全面指南

本文全面解析银河麒麟V10操作系统的新特性,从安装指南到AI应用开发,详细介绍了其智能调度引擎、神经网络加速和场景化AI工具集等核心功能。通过实战案例展示如何高效配置AI环境、优化性能,并解决常见问题,助力开发者在国产操作系统上实现高效AI开发与应用部署。

seed的博客 299

【c++设计模式09】结构型1:适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而无法合作的类能够协同工作。

junxuezheng的博客 2051

【excel+vba】一表拆多表+不同收件人附带不同附件

快捷处理:拆分多个不同表 给不同人发送不同内容且附带附件

weixin_42779327的博客 2968

结构型设计模式: 适配器模式(Adapter Pattern)

设计模式;结构型模式;结构型设计模式;适配器模式(Adapter Pattern)将一个类的接口转换成客户希望的另外一个接口。 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式(Adapter Pattern)属于结构型模式,又称为包装器(Wrapper)模式。结构型模式涉及到如何组合类和对象以获得更大的结构;结构型类模式采用继承机制来组合接口或实现。

智能多媒体 849

RAGFlow 系列教程 第三课:后端服务入口与请求生命周期

本文深入解析RAGFlow v0.25.0后端核心机制,重点介绍了Quart框架选型原因和服务启动流程。RAGFlow选择Quart作为Web框架,主要基于其异步能力对LLM调用的支持、Flask生态兼容性以及长响应超时处理优势。文章详细拆解了服务启动的8个关键步骤,从日志初始化到HTTP服务启动,并分析了配置加载、数据库初始化等核心环节。通过源码分析揭示了RAGFlow如何实现动态API注册、双重认证体系等关键技术点,为深入理解该系统的请求处理生命周期提供了基础。

weixin_43674738的博客 187

【PCIe 总线及设备入门学习专栏 6.1 -- PCIe MCTP】

MCTP 是由 DMTF(Distributed Management Task Force)定义的协议,用于提供设备和主机间基于不同传输层(如 PCIe、I²C、USB 等)的管理消息通信能力。在 PCIe 环境下,MCTP 消息作为的一种特殊形式传输,并被赋予唯一的 VDM Code 值0000b,以区别于其他 VDM。MCTP 在 PCIe 环境中作为一种基于 Type 1 VDM 的管理通信协议,提供了设备与主机之间的灵活数据传输能力。

CodingCos的博客 2127

【C#设计模式】6.适配器模式(Adapter Pattern)【结构型】

1.1 动机(Motivate) 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口? 1.2 意图(Intent) 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 --《设计模式》Gof .........

星Yeah 的博客 3310

微信小程序 - 解决web-view嵌套H5网页白屏问题,将h5网页嵌套在webview页面出现无法加载一片空白,详解微信小程序<web-view>页面跳转出现白屏情况(无论本地还是线上H5都能解决)

微信小程序解决web-view打开网页在手机上出现白屏的问题,小程序web-view嵌套H5项目白屏问题分析及解决,使用web-view组件加载H5网页链接后白屏情况,小程序嵌套的h5网页中跳转页面时也有可能出现白屏问题,嵌套webview页面时,出现白屏,WebView 加载不出网页,微信小程序<web-view>页面跳转出现白屏解决方法,解决WebView白屏空白,H5内嵌第三方小程序打开白屏,微信小程序嵌入h5页面加载空白,微信小程序web-view跳转h5白屏,解决微信小程序web-view打开网页

🏆 前端领域优质创作者 1万+

设计模式基础概念(结构型模式):适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。适配器模式。 被。适配器。它的运作方式如下:实现时使用了构成原则: 适配器实现了其中一个对象的接口, 并对另一个对象进行封装。所有流行的编程语言都可以实现适配器。 这一实现使用了继承机制: 适配器同时继承两个对象的接口。请注意, 这种方式仅能在支持多重继承的编程语言中实现, 例如 C++。 使用示例: 适配器模式在 Java 代码中很常见。 基于一些遗留代码的系统常常会使用该模式。 在这种情况下, 适配器让遗留代码与现代的类得以相互合作。

учёба 1312

面试问题总结——关于YOLO系列(三)

接着上篇的的YOLO系列面试问题总结,加油,冲! 三.YOLOv3 1.YOLOv3主干网络BackBone——Darknet-53网络结构(因为有53个卷积层) (原论文中Darknet53的尺寸是在图片分类训练集上训练的,所以输入的图像尺寸是256x256,而在YOLOv3中输入尺寸是416×416)   ①上图中,Top-1 Accuracy和Top-5 Accuracy是指什么呢?区别在哪呢?   我们知道ImageNet有大概1000个分类,而模型预测某张图片时,会给出1000个按概率从高.

boss-dog 1万+

【实战】Python 携程酒店价格实时抓取爬虫项目全解析

摘要:本文介绍了一个基于Python的携程酒店价格实时抓取系统开发方案。系统采用Requests、BeautifulSoup和Selenium等技术栈,实现了多城市、多日期的酒店数据采集,包括价格、评分、位置等关键信息。通过请求头伪装、IP代理、随机等待等反爬策略,有效应对携程的反爬机制。系统支持数据清洗、去重和CSV/Excel导出,并提供了多线程优化、代理池集成等进阶方案。本文详细阐述了技术原理、代码实现和优化策略,同时强调了数据采集的合法合规性,为旅游行业数据分析提供了可靠的数据获取方案。

2503_91057718的博客 2604

适配器模式(Adapter Pattern)是一种结构型设计模式

✅ **结构差异(关键)**: - 适配器的**被包装对象类型 ≠ 客户端期望接口类型**(例如:包装 `RS232Device`,但实现 `USBReader` 接口)→ **类型转换发生**。 - 装饰器的**被包装对象与自身实现同一接口**(例如:`CompressedStream` 和 `EncryptedStream` 都实现 `DataStream` 接口)→ **类型一致,可无限叠加**。 ✅ **生命周期与用途**: - 适配器通常是**一次性桥接工具**,用于集成遗留系统或

[Blog][Domain] programb.blog.youkuaiyun.com 214

14003.xilinx系统移植

文章目录1 xilinx 系统移植 sd卡版本1.1 创建项目1.2 拷贝 *.hdf 到工程目录1.3 根据hdf文件对系统进行配置1.3.1 设置内核源码路径为本地1.3.2 设置分区的名称与大小1.4 清除本地缓存并编译成功1.5 打包生成BOOT.BIN并拷贝到sd卡1.6 问题1.7 系统启动成功1.8 配置设备树文件丰富系统外设 1 xilinx 系统移植 sd卡版本 芯片型号 ZYNQ UltraScale+ XAZU2EG ,对应厂家提供的demo板为 zu102或zu104 1.1 创建

写给自己的笔记 481

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

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

Fatter$hday的博客 1931

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

设计模式 结构型 适配器模式(Adapter Pattern)与 常见技术框架应用 解析

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口,从而使原本因接口不兼容而无法一起工作的类能够协同工作。这种设计模式在软件开发中非常有用,尤其是在需要集成不同系统或库时,它们的接口可能并不一致。

JINGWHALE 1690

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Java 设计模式 · 结构型】适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。

茶色喵的博客 305

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

设计模式 ~ 结构型模式 ~ 适配器模式 ~ Adapter Pattern。

设计模式 ~ 结构型模式 ~ 适配器模式 ~ Adapter Pattern。

lyfGeek的博客 276

DesignPattern - 适配器模式【结构型】

欢迎关注微信公众号:FSA全栈行动 ???? 一、适配器模式介绍 适配器模式(Adapter Pattern)属于结构型模式,作为两个不兼容的接口之间的桥梁。 常见的几类适配器 接口的适配器模式【空实现】:不想实现一个接口中所有的方法时,可以创建一个 Adapter,实现所有方法,在写别的类的时候,继承这个 Adapter 类即可。 类的适配器模式【继承(旧) + 实现(新)】:想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。 对象的适配器

GitLqr的博客 331

C# 设计模式:第六章 - 结构型模式 之 适配器模式(Adapter Pattern)

在这章中,我们学习了适配器模式的基本概念、应用场景、实现方法以及注意事项。适配器模式提供了一种将一个类的接口转换成客户端期望的另一个接口的方式,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。我们通过两个实际的代码示例展示了如何在 C# 中实现适配器模式,包括基本适配器模式和支付网关适配器。最后,我们还讨论了一些使用适配器模式时需要注意的地方,帮助你在实际开发中做出明智的选择。

caifox的博客 1028

设计模式 - 结构型 - 适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,用于解决接口不兼容问题,使原本不能协同工作的类或对象能够一起工作。其核心是通过中间转换层(适配器)将已有接口转换为客户端期望的接口形态,实现接口兼容性。适配器模式分为类适配器(继承实现)和对象适配器(组合实现),后者更灵活推荐使用。优点包括代码复用、解耦和灵活扩展,但可能增加系统复杂性。典型应用场景包括系统集成、遗留系统升级和硬件接口转换。实际案例有Java集合框架、Spring的JdbcTemplate和日志框架整合等。该模式平衡了灵活性与复杂度,是解决接口兼容问题的有效方

csdn_tom_168的博客 489

【设计模式】【结构型模式(Structural Patterns)】之适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,它允许不兼容的接口协同工作。适配器模式通过创建一个适配器类来实现目标接口,并持有对适配者类的引用,从而将适配者的方法转换为目标接口的方法。

ido1ok的博客 786

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

适配器模式是一种结构型设计模式,它允许不兼容的接口之间进行适配,使得原本无法一起工作的类可以协同工作。适配器模式通过引入一个适配器类,将一个类的接口转换成客户端所期待的接口,从而使原本由于接口不兼容而不能一起工作的两个类能够协同工作。适配器模式(Adapter Pattern)是一种结构型设计模式,它允许现有的类与其他类或接口进行协作,解决了类之间接口不兼容的问题。

针线犹存未忍开 1911

【设计模式】【结构型模式】适配器模式(Adpter)

适配器模式是Java中常用的结构型设计模式,它的核心作用就像现实中的电源转换器一样——让原本不兼容的两个接口能够协同工作。解耦性将客户端与具体实现分离,客户端只依赖目标接口,无需关心底层实现。例如:Spring MVC 的只依赖接口,不关心具体Controller的实现。复用性可以复用现有的类或第三方库,而无需修改其源码。例如:通过复用的功能。扩展性新增适配器即可支持新的实现,符合开闭原则。例如:Spring MVC 新增一种Controller类型时,只需添加对应的。透明性。

flzjkl的博客 879

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

适配器模式是一种结构型设计模式,重点在“适配”二字,它可以将不兼容的接口转换成可兼容的接口,它可以在不改变现有代码的前提下使不兼容的接口之间能够正常工作。

weixin_42118323的博客 996

【Java 设计模式】结构型之适配器模式

适配器模式是一种结构型设计模式,它允许一个接口转换成另一个接口。它允许原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式通常包含三个主要角色:目标接口(Target)、被适配者(Adaptee)、适配器(Adapter)。客户端期望的接口,适配器将被适配者适配成这个接口需要被适配的类或接口,它与目标接口不兼容通过实现目标接口并包装被适配者,使得被适配者的接口能够被客户端调用适配器模式是一种在面对不同接口的系统集成中非常有用的设计模式。

好久不见的流星 1435

【设计模式】结构型模式-适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构型设计模式,其核心目标是通过一个中间层(适配器)将不兼容的接口转换为客户端期望的接口,使原本无法协同工作的类能够协同。

weixin_43510208的博客 1046
上一篇: 创建型设计模式之原型模式
下一篇: 结构型设计模式之桥接模式
WDaMu
博客等级 码龄4年 27粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值