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

设计模式:适配器模式

定义

适配器模式(Adapter Pattern),也称为包装器(Wrapper)模式,是一种结构型设计模式,它允许不兼容的接口之间进行交互。适配器模式通过包装一个已有的类,提供一个与原系统兼容的接口,从而使得原本由于接口不兼容而不能一起工作的类可以协同工作。

应用场景

适配器模式通常在以下场景中使用:

  • 当你希望使用某个类,但是它的接口与其他代码不兼容时。
  • 当你想创建一个可重用的类,该类可以与未知的或未来的类(即那些接口可能不兼容的类)协同工作。
  • 当你需要使用几个现有的子类,但是子类化每个类以适配它们的接口会导致代码可用性下降时。

示例

假设有一个旧的电子邮件系统,它的客户端代码只能与EmailClient接口兼容。现在,你想要集成一个新的邮件系统,但是其接口与旧系统不兼容。适配器模式可以在这里发挥作用。

// 旧的电子邮件客户端接口
public interface EmailClient {void sendEmail(String messageBody);
}// 新的邮件系统接口
public interface AdvancedEmailClient {void sendEmailMessage(String subject, String body);
}// 适配器实现
public class EmailAdapter implements EmailClient {private AdvancedEmailClient advancedEmailClient;public EmailAdapter(AdvancedEmailClient client) {this.advancedEmailClient = client;}@Overridepublic void sendEmail(String messageBody) {advancedEmailClient.sendEmailMessage("Adapted", messageBody);}
}// 新邮件系统类实现
public class NewEmailSystem implements AdvancedEmailClient {public void sendEmailMessage(String subject, String body) {// 新邮件系统的发送逻辑}
}// 客户端代码
public class Client {public static void main(String[] args) {AdvancedEmailClient newEmailSystem = new NewEmailSystem();EmailClient client = new EmailAdapter(newEmailSystem);client.sendEmail("Hello World!");}
}

原则间的权衡与冲突

适配器模式遵循了以下设计原则:

  • 开闭原则:允许系统接受新的适配器或已有适配器的变化,而无需修改现有代码。
  • 单一职责原则:适配器类的唯一职责是将一个接口转换为另一个接口。

然而,过多地使用适配器可能会导致系统中类的数量增加,并且增加系统的复杂性,这可能与简洁性(KISS)原则和最少知识原则(Law of Demeter)相冲突。

设计模式的局限性

  • 过度使用:过度使用适配器可能会导致系统变得非常混乱,很难理解和维护。
  • 不是万能的:适配器模式无法适配所有的接口问题,特别是当待适配的类的接口非常复杂时。

总结与建议

适配器模式是实现系统间组件接口兼容的一个有效途径。它允许现有系统与第三方库、新系统或者未来的系统进行交互,而不需要修改现有的代码。

建议在以下情况使用适配器模式:

  • 需要使用现有类,但其接口与其他代码不兼容时。
  • 需要创建可以与未知或不相关的类协同工作的灵活代码时。

在设计系统时,应当谨慎使用适配器模式,以避免不必要的复杂性。如果接口不匹配的问题可以通过重构来解决,那么可能更应该选择重构而非适配器。适配器模式应当作为连接不兼容接口的最后手段,而不是首选解决方案。

相关文章:

设计模式:适配器模式

定义 适配器模式(Adapter Pattern),也称为包装器(Wrapper)模式,是一种结构型设计模式,它允许不兼容的接口之间进行交互。适配器模式通过包装一个已有的类,提供一个与原系统兼容的接…...

大语言模型落地的关键技术:RAG

1、什么是RAG? RAG 是检索增强生成(Retrieval-Augmented Generation)的简称,是当前最火热的大语言模型应用落地的关键技术,主要用于提高语言模型的效果和准确性。它结合了两种主要的NLP方法:检索&#xff…...

ffmpeg Android 笔记

目录 没有示例项目 编译好的.a文件 ffmpegandroid 延时有220ms rk官方有例子 ffmpeg Android 笔记 没有示例项目 编译好的.a文件 FFmpeg-Android/ffmpeg-android-aarch64-34/lib at main yhbsh/FFmpeg-Android GitHub ffmpegandroid 看到了音频解码器 FFmpegAndroid/a…...

本地创建新分支并提交gitee

初始化本地仓库 git init链接远程仓库 git remote add origin https://gitee.com/xxxxxxxxxxx提交本地代码(进行commit提交) git add . git commit -m "分支名"创建分支 git branch 分支名选择刚刚创建的分支 git checkout 分支名查看所选中的分支 git branch …...

[蓝桥杯 2019 国 C] 数正方形

[蓝桥杯 2019 国 C] 数正方形 题目描述 在一个 N N N \times N NN 的点阵上,取其中 4 4 4 个点恰好组成一个正方形的 4 4 4 个顶点,一共有多少种不同的取法? 由于结果可能非常大,你只需要输出模 1 0 9 7 10^9 7 1097 的…...

Redis: 配置文件详解(Redis.conf)

文章目录 一、Units二、INCLUDES三、NETWORK四、GENERAL五、SECURITY六、LIMITS 一、Units 单位,配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit,大小写不敏感 二、INCLUDES 包含,多…...

学习vue3第十四节 Teleport 内置组件介绍

<Teleport></Teleport> 作用目的&#xff1a; 用于将指定的组件或者元素传送到指定的位置&#xff1b; 通常是自定义的全局通用弹窗&#xff0c;绑定到 body 上&#xff0c;而不是在当前元素上面&#xff1b; 使用方法&#xff1a; 接收两个参数 to: 要将目标传…...

mybatis模糊查询查不到数据

排除SQL语句本身存在错误,字段名称不匹配,编码格式问题后,若使用%方式查询,一开始使用单引号查询不到数据&#xff0c;把改成"&#xff0c;可以查询到数据 疑问&#xff1a;看别人的代码&#xff0c;使用单引号也可以查询到数据&#xff0c;原因未知...

Python语法总结:not(常出现错误)

0、not是什么 在python中not是逻辑判断词&#xff0c;用于布尔型True和False之前 a not Ture # a False b not False # b True1、not的用法 &#xff08;1&#xff09;判断语句 if not a:# 如果a是False&#xff0c;执行的语句&#xff08;2&#xff09;判断元素是否在…...

深入理解WebSocket:实时双向通信的利器

一、介绍 1.1 基础概念介绍 单工通信&#xff1a;数据传输只允许在一个方向上传输&#xff0c;只能一方发送数据&#xff0c;另一方接收数据并发送。半双工&#xff1a;数据传输允许两个方向上的传输&#xff0c;但在同一时间内&#xff0c;只可以有一方发送或接收数据。全双…...

Gateway是什么?(SpringCloudAlibaba组件)

1、网关介绍 **网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连&#xff0c;是最复杂的网络互连设备&#xff0c;仅用于两个高层协议不同的网络互连。**网关的结构也和路由器类似&#xff0c;不同的是互连层。网关既可以用于广域网互连&#xff0c;也可…...

阿里巴巴拍立淘API新功能揭秘:图片秒搜商品,实现智能化个性化购物新体验

在数字化快速发展的今天&#xff0c;智能化和个性化已经成为购物体验中不可或缺的元素。为了满足消费者日益增长的购物需求&#xff0c;阿里巴巴中国站不断推陈出新&#xff0c;其中拍立淘API的新功能——图片秒搜商品&#xff0c;无疑为智能化个性化购物体验开创了新的篇章。 …...

蚓链为移动实体经济加油!

在当今数字化时代&#xff0c;数据已成为企业宝贵的资产之一。如何利用数据资产为可移动实体经济创造更多的增值机会呢&#xff1f;蚓链将为你揭示 11种行之有效的方法&#xff01; 1. 个性化服务&#xff1a;根据客户数据&#xff0c;提供量身定制的产品和服务&#xff0c;满…...

MySQL 核心模块揭秘 | 12 期 | 创建 savepoint

回滚操作&#xff0c;除了回滚整个事务&#xff0c;还可以部分回滚。部分回滚&#xff0c;需要保存点&#xff08;savepoint&#xff09;的协助。本文我们先看看保存点里面都有什么。 作者&#xff1a;操盛春&#xff0c;爱可生技术专家&#xff0c;公众号『一树一溪』作者&…...

SpringMVC --- 老杜

1、什么是SpringMVC&#xff1f; SpringMVC是一个基于Java实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清晰的及部分&#xff0c;…...

详细介绍如何利用 A star(A*)算法解决8数码问题

文章目录 1. A star(A*)算法简介2. 利用A*解决8数码问题(含Python代码)2.1 什么是8数码问题2.2 A*算法中的开放列表和关闭列表2.3 A*算法解决8数码问题过程2.3.1 计算节点(棋盘顺序)间距离2.3.2 交换数字生成新的节点2.3.3 A*主求解程序1. A star(A*)算法简介 A ∗ A^*…...

如何锁定鼠标光标在水平、垂直或45度对角线模式下移动 - 鼠标水平垂直移动锁定器简易教程

在我们进行精细工作例如如创建图标和图形设计时&#xff0c;通常需要我们对鼠标移动进行精确控制。一旦向左或向右轻微移动&#xff0c;都可能导致设计出错。若出现不必要的错误&#xff0c;我们极有可能不得不重新开始&#xff0c;这会令人感到非常沮丧。这种情况下&#xff0…...

在 Docker 部署的 MySQL 容器内安装和使用 vim

在 Docker 部署的 MySQL 容器内安装和使用 vim 文章目录 在 Docker 部署的 MySQL 容器内安装和使用 vim步骤一&#xff1a;进入 MySQL 容器步骤二&#xff1a;更新软件源和安装 vim步骤三&#xff1a;验证 vim 安装步骤四&#xff1a;使用 vim 进行文件编辑步骤五&#xff1a;保…...

人工智能|深度学习——基于Xception实现戴口罩人脸表情识别

一、项目背景 近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;人脸表情识别已经成为了计算机视觉领域中的重要研究方向之一。然而&#xff0c;在当前的疫情形势下&#xff0c;佩戴口罩已经成为了一项必要的防疫措施&#xff0c;但是佩戴口罩会遮挡住人脸的部分区域&…...

【HTML】简单制作一个动态3D正方体

目录 前言 开始 HTML部分 JS部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;JS的文件名改…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...