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

设计模式 - 适配器模式

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、适配器模式的基本概念
      • 二、适配器模式的实现
        • 1. 定义目标接口
        • 2. 定义适配者接口
        • 3. 定义具体适配者类
        • 4. 定义适配器类
        • 5. 客户端代码
      • 三、适配器模式的优点
      • 四、适配器模式的缺点
      • 五、适配器模式的应用场景
      • 六、适配器模式的变种
        • 1. 类适配器模式
        • 2. 对象适配器模式
        • 3. 多重适配器模式
      • 七、适配器模式与装饰器模式的区别
      • 八、总结

引言

适配器模式是一种结构型设计模式,它允许不兼容的接口协同工作。通过使用适配器,可以将一个类的接口转换成客户希望的另一个接口。这种模式常常用于解决两个类接口不匹配的问题,使得原本因接口不兼容而不能一起工作的类可以一起工作。本文将详细介绍适配器模式的概念,并通过具体的Java代码示例来说明如何实现这一模式。

一、适配器模式的基本概念

适配器模式的主要参与者包括:

  1. Target:定义了客户端使用的接口。
  2. Adaptee:定义了需要适配的现有接口。
  3. Adapter:通过继承或组合Adaptee来实现Target接口,从而将Adaptee接口转换为Target接口。

二、适配器模式的实现

接下来,我们将通过一个示例来详细了解适配器模式的实现步骤。

1. 定义目标接口

首先,定义目标接口,这是客户端期望使用的接口:

// 目标接口
public interface Target {void request();
}
2. 定义适配者接口

接下来,定义适配者接口,这是需要适配的现有接口:

// 适配者接口
public interface Adaptee {void specificRequest();
}
3. 定义具体适配者类

实现适配者接口,具体适配者类提供了需要适配的方法:

// 具体适配者类
public class ConcreteAdaptee implements Adaptee {@Overridepublic void specificRequest() {System.out.println("ConcreteAdaptee specific request.");}
}
4. 定义适配器类

实现目标接口,适配器类将适配者接口转换为目标接口:

// 适配器类
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}
5. 客户端代码

客户端代码使用目标接口来调用适配器类:

public class ClientApplication {public static void main(String[] args) {Adaptee adaptee = new ConcreteAdaptee();Target adapter = new Adapter(adaptee);adapter.request();  // 通过适配器调用适配者的方法}
}

三、适配器模式的优点

  1. 增强灵活性:通过适配器模式,可以轻松地让原本不兼容的接口协同工作。
  2. 符合开闭原则:适配器模式遵循开闭原则,可以在不修改原有代码的基础上增加新的功能。
  3. 简化代码:适配器模式可以简化客户端代码,使其不必关心具体的适配者类。

四、适配器模式的缺点

  1. 类数量增加:适配器模式会增加类的数量,可能会使系统变得更加复杂。
  2. 过度设计:在某些情况下,适配器模式可能导致过度设计。

五、适配器模式的应用场景

适配器模式适用于以下情况:

  1. 系统集成:当需要将第三方库或旧系统中的类集成到现有系统中时。
  2. 接口不兼容:当一个类的接口与另一个类的接口不兼容,但又希望这两个类可以一起工作时。
  3. 兼容性:当需要为一个已经存在的类添加一些额外的功能,但又不想修改原有类时。

六、适配器模式的变种

除了上述的基本适配器模式外,还有以下几种变种:

  1. 类适配器模式:适配器通过继承适配者类来实现目标接口。
  2. 对象适配器模式:适配器通过组合适配者类来实现目标接口。
  3. 多重适配器模式:一个适配器类可以适配多个适配者类。
1. 类适配器模式
// 类适配器模式
public class ClassAdapter extends ConcreteAdaptee implements Target {@Overridepublic void request() {specificRequest();}
}
2. 对象适配器模式
// 对象适配器模式
public class ObjectAdapter implements Target {private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}
3. 多重适配器模式
// 多重适配器模式
public interface Adaptee1 {void specificRequest1();
}public interface Adaptee2 {void specificRequest2();
}public class MultiAdapter implements Target {private Adaptee1 adaptee1;private Adaptee2 adaptee2;public MultiAdapter(Adaptee1 adaptee1, Adaptee2 adaptee2) {this.adaptee1 = adaptee1;this.adaptee2 = adaptee2;}@Overridepublic void request() {adaptee1.specificRequest1();adaptee2.specificRequest2();}
}

七、适配器模式与装饰器模式的区别

适配器模式和装饰器模式都是结构型设计模式,但它们之间存在显著差异:

  1. 目的:适配器模式的目的是让两个不兼容的接口可以协同工作,而装饰器模式的目的是动态地给一个对象添加一些额外的责任。
  2. 适用范围:适配器模式适用于接口不兼容的情况,而装饰器模式适用于需要扩展对象功能的情况。
  3. 设计思想:适配器模式侧重于转换接口,而装饰器模式侧重于添加责任。

八、总结

通过本文的详细介绍和示例代码,相信你应该已经了解了适配器模式的基本实现细节及其在不同情况下的表现。适配器模式是面向对象设计中一种非常有用的模式,特别是在需要让两个不兼容的接口协同工作的情况下。在实际编程中,适配器模式可以用于构建高度可配置和可扩展的系统,尤其是在需要支持多种不同类型的产品时。通过上述实现,你可以根据自己的需求进一步扩展和优化适配器模式的应用。

适配器模式虽然简单,但在设计系统时需要考虑到其潜在的问题,比如类的数量增加等。正确地使用适配器模式可以使你的代码更加健壮和易于维护。


💝💝💝如有需要请大家订阅我的专栏【设计模式】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

设计模式相关文章索引文章链接
设计模式 - 抽象工厂模式 设计模式 - 抽象工厂模式
设计模式 - 单例模式 设计模式 - 单例模式
设计模式 - 建造者模式 设计模式 - 建造者模式
设计模式 - 原型模式 设计模式 - 原型模式

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关文章:

设计模式 - 适配器模式

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、适配器…...

docker部署minIO

docker部署minIO 旧版本新版本 旧版本 #-u 以root用户运行容器;--privilegedtrue 给予容器命令访问权限 docker pull minio/minio:RELEASE.2021-06-17T00-10-46Z docker run -p 9001:9000 --name minio -d \-u root --privilegedtrue \-e "MINIO_ROOT_USERmin…...

「Pytorch」BF16 Mixed Precision Training

在深度学习领域,神经网络的训练性能瓶颈常常出现在 GPU显存的使用上。主要表现为两方面: 单卡上可容纳的模型和数据量有限;显存与计算单元之间的带宽和延迟限制了运算速度; 为了解决显卡瓶颈的问题,涌现了不同的解决…...

论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024

还记得我们昨天讨论的《Querying Historical Cohesive Subgraphs over Temporal Bipartite Graphs》这篇论文吗? https://blog.csdn.net/m0_62361730/article/details/141003301 这篇(还没看的快去看) 这篇论文主要研究如何在时间双向图上查询历史凝聚子图,而《E…...

LLMOps — 使用 BentoML 为 Llama-3 模型提供服务

使用 BentoML 和 Runpod 快速设置 LLM API 经常看到数据科学家对 LLM 的开发感兴趣,包括模型架构、训练技术或数据收集。然而,我注意到,很多时候,除了理论方面,许多人在以用户实际使用的方式提供这些模型时遇到了问题…...

微软蓝屏事件揭秘:有问题的数据引发内存读取越界

讲动人的故事,写懂人的代码 CrowdStrike前一阵在官网上发布了上周爆发的全球企业微软蓝屏事件的官方初步复盘结果。其中谈到了这次事件的根本原因: 2024年7月19日,我们部署了两个额外的IPC模板实例。由于内容验证器中的一个bug,使…...

NASA:北极ARCTAS差分吸收激光雷达(DIAL)遥感数据

ARCTAS Differential Absorption Lidar (DIAL) Remotely Sensed Data ARCTAS差分吸收激光雷达(DIAL)遥感数据 简介 ARCTAS差分吸收激光雷达(DIAL)遥感数据是一种远程感测技术,用于测量大气中不同波长的激光辐射被大…...

Android 文件上传与下载

在实际开发涉及文件上传不会自己写上传代码,一般 会集成第三网络库来做图片上传,比如android-async-http,okhttp等,另外还有七牛也提供 了下载和上传的API。 1.项目用到的图片上传的关键方法: 这里用到一个第三方的库…...

Java语言的充电桩系统Charging station system

介绍 SpringBoot 框架,充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5-1.6协议新能源汽车二轮车公交车二轮车充电-四轮车充电充电源代码充电平台源码Java源码-共享充电桩-充电桩软件 软件介绍 小程序端:城市切换、附近电站、电桩详情页…...

RCE之无参数读取文件

什么是无参数&#xff1f; 顾名思义&#xff0c;就是只使用函数&#xff0c;且函数不能带有参数&#xff0c;这里有种种限制&#xff1a;比如我们选择的函数必须能接受其括号内函数的返回值&#xff1b;使用的函数规定必须参数为空或者为一个参数等 例题&#xff1a; <?…...

Python GUI开发必看:Tkinter Button控件使用详解

Button&#xff08;按钮&#xff09;组件用于实现各种各样的按钮。 Button组件可以包含文本或图像&#xff0c;你可以将一个Python的函数或方法与之相关联&#xff0c;当按钮被按下时&#xff0c;对应的函数或方法将被自动执行。 Button组件仅能显示单一字体的文本&#xff0c…...

上海市计算机学会竞赛平台2024年7月月赛丙组得分排名

题目描述 给定 nn 名学生的考试得分&#xff0c;这些学生的学号为 11 到 nn&#xff0c;其第 ii 号学生的得分为 aiai​&#xff0c;请将这些学生按照分数从大到小的顺序排列并输出学号序列。 若两个学生得分相同&#xff0c;则先输出较小的学号。 输入格式 第一行&#xf…...

Can GPT-3 Perform Statutory Reasoning?

文章目录 题目摘要相关工作SARAGPT-3 对美国法典的了解GPT-3 在对合成法规进行简单推理时遇到困难结论 题目 GPT-3 可以进行法定推理吗&#xff1f; 论文地址&#xff1a;https://arxiv.org/abs/2302.06100 摘要 法定推理是用事实和法规进行推理的任务&#xff0c;法规是立法机…...

redis面试(十一)锁超时

boolean res lock.tryLock(100, 10, TimeUnit.SECONDS); RedissonLock里面有这样一个方法tryLock()&#xff0c;意思是尝试获取锁的结果。 最大等待时间100s&#xff0c;并且获取到锁之后&#xff0c;10s之内没有释放的话&#xff0c;锁会自动失效。 尝试获取锁超时 time …...

C代码做底层及Matlab_SimuLink做应用层设计单片机程序

前言:SimuLink工具极其强大,但是能直接支持单片机自主开发的很少,造成这个问题的原因主要是我们使用的芯片底层多是C代码工程,芯片厂家也只提供C代码库,很少能提供SimuLink的支持库,即使提供也不是很不完善,如NXP的一些芯片提供的SimuLink库不含盖高级应用,再比如意法半…...

Cloud Kernel SIG 月度动态:ANCK OOT 驱动基线更新,发布 2 个 ANCK 版本

Cloud Kernel SIG&#xff08;Special Interest Group&#xff09;&#xff1a;支撑龙蜥内核版本的研发、发布和服务&#xff0c;提供生产可用的高性价比内核产品。 01 SIG 整体进展 1. 发布 ANCK 5.10-016.4 小版本。 2. 发布 ANCK 5.10-017.1 小版本。 3. ANCK 新增海光平…...

vue3仿飞书头像,根据不同名称生成不同的头像背景色

效果展示&#xff1a; 传递三个参数&#xff1a; name&#xff1a;要显示的名称&#xff1b;size&#xff1a;头像的大小&#xff1b;cutNum&#xff1a;分割当前名称的最后几位数&#xff1b; 代码如下&#xff1a; <template><div:style"{color: #fff,borde…...

SpringBoot整合三方

SpringBoot整合redis 引入redis依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId&g…...

React之组件的使用

Vue、React和Angular是三个流行的前端框架&#xff0c;采用组件化的开发方式。支持虚拟DOM&#xff08;Virtual DOM&#xff09;技术&#xff0c;有丰富的生态系统、大量的插件和工具可以使用。Vue的语法是传统的HTML和JavaScript&#xff0c;React使用JSX语法&#xff0c;Angu…...

深度学习--长短期记忆网络

1.引入 RNN 可以将以前的信息与当前的信息进行连接。例如&#xff0c;在视频中&#xff0c;可以用前面的帧来 帮助理解当前帧的内容&#xff1b;在文本中&#xff0c;可以用前面半句话的内容来预测后面的内容。但是&#xff0c; RNN 存在一个记忆消失的问题。例如&#xff0c;…...

SEO 系统培训班有哪些推荐_SEO 系统培训班包括哪些内容

SEO 系统培训班推荐及其内容详解 在当前数字化和信息化飞速发展的时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为每一个网站和企业不可或缺的一部分。SEO系统培训班不仅能帮助你了解SEO的基本原理&#xff0c;还能深入探讨其实际应用和最新技巧。本文将详细…...

从模型到落地:音频降噪技术选型与工程化实战指南

1. 音频降噪技术选型的核心挑战 当你第一次把降噪模型部署到手机端时&#xff0c;大概率会遇到这样的场景&#xff1a;实验室里效果惊艳的模型&#xff0c;在实际设备上要么卡成幻灯片&#xff0c;要么耗电像开了暖手宝。这就是端侧音频降噪最现实的困境——我们必须在效果、算…...

不只是代码:用 Agent 构建全自动数据分析与可视化流水线

不只是代码:用 Agent 构建全自动数据分析与可视化流水线 1. 引入与连接:从"手动分析"到"智能自动化"的范式转变 1.1 一个数据分析师的典型一天 让我们想象一下,李明是一家互联网公司的资深数据分析师。每天早上9点,他都会坐在电脑前开始他熟悉的工作…...

3步搞定B站音视频分离:BilibiliDown开源工具的实战指南

3步搞定B站音视频分离&#xff1a;BilibiliDown开源工具的实战指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/…...

Stable Diffusion 3.5 FP8镜像:简化部署流程,提升使用体验

Stable Diffusion 3.5 FP8镜像&#xff1a;简化部署流程&#xff0c;提升使用体验 1. 镜像概述 Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型&#xff0c;相比 3.0 版本&#xff0c;它在图像质量、运行速度和硬件效率方面都有显著提升。…...

GLM-4.1V-9B-Base惊艳输出:对‘抽象艺术画’的风格、情绪、创作意图推测

GLM-4.1V-9B-Base惊艳输出&#xff1a;对抽象艺术画的风格、情绪、创作意图推测 1. 视觉理解模型的新突破 GLM-4.1V-9B-Base作为智谱开源的视觉多模态理解模型&#xff0c;在艺术领域展现出令人惊艳的分析能力。不同于传统图像识别工具&#xff0c;这款模型能够深入解读抽象艺…...

douyin-downloader:高效采集抖音内容的全流程解决方案

douyin-downloader&#xff1a;高效采集抖音内容的全流程解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppo…...

目标金额是否能被给定硬币组成或者最少硬币数量

在编程中&#xff0c;判断一个目标金额能否由一组给定的硬币组成&#xff0c;这是一个经典的“硬币找零”或“完全背包”问题。 最常用且高效的解决方法是使用动态规划 核心思路 将这个问题分解成更小的子问题。 是不是在想当前金额&#xff0c;怎么知道能够由哪些已知硬币凑成…...

G-Helper终极指南:3分钟摆脱华硕笔记本性能烦恼

G-Helper终极指南&#xff1a;3分钟摆脱华硕笔记本性能烦恼 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, an…...

Fix-Kindle-Ebook-Cover彻底解决Kindle电子书封面丢失问题:从根源修复到长效管理

Fix-Kindle-Ebook-Cover彻底解决Kindle电子书封面丢失问题&#xff1a;从根源修复到长效管理 【免费下载链接】Fix-Kindle-Ebook-Cover A tool to fix damaged cover of Kindle ebook. 项目地址: https://gitcode.com/gh_mirrors/fi/Fix-Kindle-Ebook-Cover Kindle电子书…...