当前位置: 首页 > 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;…...

DISMTools企业部署:在组织中大规模应用的最佳实践

DISMTools企业部署&#xff1a;在组织中大规模应用的最佳实践 【免费下载链接】DISMTools The connected place for Windows system administration 项目地址: https://gitcode.com/GitHub_Trending/di/DISMTools DISMTools是一款专为Windows系统管理设计的连接平台&…...

CVPR 2023反无人机数据集实战:用ModelScope上的开源模型快速上手目标检测

CVPR 2023反无人机数据集实战&#xff1a;用ModelScope上的开源模型快速上手目标检测无人机技术的普及带来了新的安全挑战&#xff0c;从隐私侵犯到关键设施威胁&#xff0c;反无人机技术正成为计算机视觉领域的热点。CVPR 2023反无人机竞赛提供的开源数据集和基线模型&#xf…...

sudo企业级应用【20260525】001篇

文章目录 一、总体设计思路 1️⃣ 设计原则 2️⃣ 日志策略(重点) 二、10 个真实生产场景(含 sudoers 配置) 🔹 Linux 系统管理(3 个) ✅ 场景 1:基础运维(用户 / 权限) ✅ 场景 2:磁盘与文件系统 ✅ 场景 3:网络与防火墙 🔹 云管理(2 个) ✅ 场景 4:云 CLI …...

户外实用|艾迪欧 R6000 测评 —— 户外 / 自驾 / 露营的通讯好搭档

户外出行&#xff0c;通讯工具的核心是稳定、清晰、耐用、续航久、功能全。艾迪欧 R6000 作为一款兼顾专业与户外的 DMR 对讲机&#xff0c;全频段覆盖、双模通讯、自定义功能、长续航&#xff0c;完美适配自驾、露营、登山、越野等户外场景&#xff0c;是户外爱好者的靠谱通讯…...

智慧树自动刷课助手:3步告别手动操作的学习效率工具

智慧树自动刷课助手&#xff1a;3步告别手动操作的学习效率工具 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台的重复刷课操作而烦恼吗&#xff1f;智…...

机器学习驱动储氢材料发现:从特征工程到DFT/MD验证的完整指南

1. 项目概述与核心思路氢能被视为未来清洁能源体系的关键一环&#xff0c;但如何安全、高效、经济地储存氢气&#xff0c;一直是制约其大规模应用的瓶颈。在众多储氢技术路线中&#xff0c;固态储氢&#xff0c;特别是基于金属氢化物的储氢材料&#xff0c;因其高体积储氢密度和…...

C++ vector容器总结

vector基本概念功能&#xff1a;vector数据结构和数组非常相似&#xff0c;也称为单端数组vector与普通数组区别&#xff1a;不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff0c;而是找更大的内存空间&a…...

3分钟快速安装BetterNCM插件管理器,让你的网易云音乐功能翻倍

3分钟快速安装BetterNCM插件管理器&#xff0c;让你的网易云音乐功能翻倍 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐功能单一而烦恼吗&#xff1f;想要解锁更多个…...

Frida无Root Hook PC微信小程序源码(Electron+Chromium)

1. 这不是“破解”&#xff0c;而是一次对微信小程序运行机制的逆向观察 你有没有试过&#xff0c;在PC版微信里点开一个小程序&#xff0c;想看看它背后是怎么写的&#xff1f;比如某个电商小程序的优惠券逻辑、某个工具类小程序的数据渲染方式&#xff0c;甚至只是单纯好奇—…...

鼎讯AM-601光纤熔接机:交通通信建设与维护的可靠伙伴

在铁路、高速公路等交通基础设施的智能化建设中&#xff0c;稳定高效的光纤网络是指挥调度、安全监控等核心系统运行的生命线。鼎讯AM-601光纤熔接机&#xff0c;作为一款专为严苛环境设计的六马达便携式熔接设备&#xff0c;正成为保障这些关键通信链路畅通无阻的可靠选择。无…...