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

结构型模式之适配器模式:让不兼容的接口兼容

在软件开发中,经常会遇到这样一种情况:系统的不同部分需要进行交互,但由于接口不兼容,导致无法直接使用。这时,适配器模式(Adapter Pattern)就能派上用场。适配器模式是设计模式中的结构型模式,它的目的是通过创建一个适配器类来“包装”一个不兼容的接口,使得两个接口能够兼容、协作。简单来说,适配器模式就是“转换接口”模式。

本文将深入探讨适配器模式,讲解其概念、应用场景,并展示如何在Java中实现适配器模式。

一、什么是适配器模式?

适配器模式的目标是使得原本由于接口不兼容而无法一起工作的类能够协同工作。它通过为不兼容的接口提供一个适配层,使得接口能够兼容并进行正常的交互。

定义:

适配器模式允许将一个类的接口转化为客户端希望的另一种接口,使得原本由于接口不兼容而无法一起工作的两个类可以合作无间。

分类:

  1. 对象适配器模式(Object Adapter):通过组合来实现适配,适配器持有一个被适配对象的引用,并将适配器的方法委托给该对象。
  2. 类适配器模式(Class Adapter):通过继承来实现适配,适配器类继承自原有的类或接口,并实现客户端所需要的接口。

二、适配器模式的结构

适配器模式通常包含以下几个角色:

  1. 目标接口(Target):客户端希望使用的接口。它是适配器模式中的标准接口,定义了客户端所需要的方法。
  2. 源接口(Adaptee):现有的接口,它已经实现了某些功能,但其接口无法直接与目标接口兼容。
  3. 适配器(Adapter):适配器通过实现目标接口并调用源接口的方法来“适配”源接口,使得客户端能够使用源接口的功能。
  4. 客户端(Client):通过目标接口调用适配器提供的功能,客户端通常不需要关心适配器的实现细节。

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

适配器模式适用于以下几种场景:

  1. 系统需要与其他类库(或组件)交互,但这些类库或组件的接口与系统不兼容。
    • 比如,你的系统需要与一个老旧的API进行交互,但是该API的接口与现代的API标准不兼容,这时可以使用适配器模式来包装该接口。
  2. 需要为某个类的接口提供不同的实现方式,尤其是在需要复用现有代码的情况下。
    • 如果你已有一个类库的实现,而希望将其适配到不同的系统或接口,可以通过适配器模式进行调整和扩展。
  3. 不同接口之间的桥接。
    • 比如,已有一个类实现了某个接口,而你希望将这个类与另一个接口一起使用时,适配器模式能够实现两者之间的桥接。

四、适配器模式的优点和缺点

优点:

  1. 增强了类的复用性:通过适配器可以将已有类与系统兼容,使得这些类能够在系统中复用,而无需修改原有代码。
  2. 灵活性和可扩展性:适配器模式允许系统灵活地集成不同的类和组件,可以在不改变客户端代码的情况下,轻松地适配不同接口。
  3. 解耦合:客户端不需要关心适配器的实现细节,只需依赖目标接口,使得客户端与具体实现解耦。

缺点:

  1. 增加了代码的复杂度:为了实现适配器模式,通常需要创建多个类和接口,可能导致代码量增加,复杂度提升。
  2. 性能开销:适配器模式可能会引入额外的间接调用,特别是在使用对象适配器时,可能会产生一定的性能开销。

五、Java中实现适配器模式

我们通过一个实际的例子来讲解如何在Java中实现适配器模式。假设我们有一个老旧的系统,该系统需要与一个现代接口进行交互,但接口不兼容。

例子:

我们有一个现代的电源接口 Target,并且现有的老旧电源接口 Adaptee 需要适配到现代接口上。

// 目标接口,现代电源适配器需要实现该接口
interface Target {void provideElectricity(); // 提供电源
}// 源接口,老旧电源接口
class Adaptee {void oldProvideElectricity() {System.out.println("老旧电源提供电源...");}
}// 适配器类,实现目标接口,使用源接口的功能
class Adapter implements Target {private Adaptee adaptee;// 通过构造方法传入老旧电源接口public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}// 实现目标接口的方法,调用老旧电源接口的功能@Overridepublic void provideElectricity() {adaptee.oldProvideElectricity();  // 将调用转发给老旧电源接口}
}// 客户端代码,使用目标接口
public class AdapterPatternExample {public static void main(String[] args) {Adaptee oldElectricity = new Adaptee();Target modernElectricity = new Adapter(oldElectricity); // 创建适配器实例modernElectricity.provideElectricity(); // 调用现代电源接口方法}
}
解释:
  1. 目标接口(Target):现代电源接口,定义了 provideElectricity() 方法。
  2. 源接口(Adaptee):老旧电源接口,定义了 oldProvideElectricity() 方法。
  3. 适配器(Adapter):实现了目标接口(Target),并将目标方法调用转发到源接口(Adaptee)的方法上。
  4. 客户端(Client):通过目标接口来调用电源提供的方法,客户端无需关心适配器的实现。

输出结果:

老旧电源提供电源...

在这个例子中,Adapter 类通过将 Target 接口的方法委托给 Adaptee 类的方法来实现适配,解决了不兼容接口的问题。

六、总结

适配器模式是非常实用的设计模式,特别是在需要将现有系统与外部组件进行集成时。通过适配器模式,可以避免修改现有代码,从而降低系统的耦合度,提高系统的灵活性和可扩展性。

适配器模式的关键是通过适配器类来封装不兼容的接口,使得客户端能够继续使用目标接口的方法,而无需关心具体的实现细节。在实际开发中,适配器模式广泛应用于各种场景,例如,旧系统与新系统的兼容、第三方库的接口适配等。

通过实现适配器模式,我们能够更灵活地管理系统中的不同接口,减少系统间的依赖和耦合,提高系统的可维护性和扩展性。

相关文章:

结构型模式之适配器模式:让不兼容的接口兼容

在软件开发中,经常会遇到这样一种情况:系统的不同部分需要进行交互,但由于接口不兼容,导致无法直接使用。这时,适配器模式(Adapter Pattern)就能派上用场。适配器模式是设计模式中的结构型模式&…...

Python 中用T = TypeVar(“T“)这个语法定义一个“类型变量”,属于类型提示系统的一部分

T TypeVar("T") 这一语法规则定义了一个泛型类型变量 T,用于标记“某种类型”,让你可以写出既通用又类型安全的代码。 TypeVar(“T”) 会创建一个名为 T 的类型占位符,这个占位符可以在后续的函数、类或方法中用作泛型参数。泛型…...

uniapp移动端图片比较器组件,仿英伟达官网rtx光追图片比较器功能

组件下载地址:https://ext.dcloud.net.cn/plugin?id22609 已测试h5和微信小程序,理论支持全平台 亮点: 简单易用 使用js计算而不是resize属性,定制化程度更高 组件挂在后可播放指示线动画,提示用户可以拖拽比较图片…...

理解我们单片机拥有的资源

目录 为什么要查询单片机拥有的资源 所以,去哪些地方可以找数据手册 一个例子:STM32F103C8T6 前言 本文章隶属于项目: Charliechen114514/BetterATK: This is a repo that helps rewrite STM32 Common Repositorieshttps://github.com/C…...

接上一篇,C++中,如何设计等价于Qt的信号与槽机制。

看下面例子: class FileManager : public QObject {Q_OBJECTpublic:FileManager(QObject* parent nullptr) : QObject(parent) {}void changeFileName(const QString& newName) {fileName newName;emit fileNameChanged(fileName);}signals:void fileNameChan…...

redis分片集群如何解决高并发写问题的?

不使用分片集群,仅使用主从复制和哨兵模式下,可以有多个主从集群,但每个主从集群一般只有一个活跃的主节点并执行写操作,每个主从集群的数据也可能(应该)是不同的,同时每个主从集群存储的数据没…...

2025 linux系统资源使用率统计docker容器使用率统计docker监控软件Weave Scope安装weavescope

1.Weave Scope介绍 Weave Scope 是一款用于监控和可视化 Docker 容器、Kubernetes 集群以及分布式应用的强大工具。它的设计目标是帮助开发者和运维人员更好地理解和管理复杂的微服务架构。以下是 Weave Scope 的主要优点: 1. 实时可视化 Weave Scope 提供了一个直…...

Spring Boot 核心知识点深度详解:自动化配置 (Auto-configuration) - 解锁 Spring Boot 的 “魔法”

Spring Boot 核心知识点深度详解:自动化配置 (Auto-configuration) - 解锁 Spring Boot 的 “魔法” ✨ 自动化配置 (Auto-configuration) 是 Spring Boot 最核心的特性之一,也是它能够大幅简化 Spring 应用开发的关键所在。 它让 Spring Boot 应用能够…...

嵌入式Linux | 什么是 BootLoader、Linux 内核(kernel)、和文件系统?

01 什么是 BootLoader 呢? 它是个引导程序,也就是硬件复位以后第一个要执行的程序,它主要工作就是初始化操作系统运行的环境,比如说内存、定时器、缓冲器等,当这个工作做完以后,再把操作系统的代码加载…...

IP关联是什么?怎么避免?

在跨境电商的道路上,大家好!今天想和大家聊一聊一个非常重要的话题,那就是IP关联的问题。在商业活动中,了解如何避免IP关联对保护我们宝贵的商铺至关重要。接下来,我们将深入探讨IP关联的概念、影响及如何有效防止这一…...

【Agent】OpenManus-Prompt组件详细分析

1. 提示词架构概述 OpenManus 的提示词组件采用了模块化设计,为不同类型的智能体提供专门的提示词模板。每个提示词模块通常包含两种核心提示词:系统提示词(System Prompt)和下一步提示词(Next Step Prompt&#xff0…...

算数操作符、赋值操作符、单目操作符、强制类型转换

一、算术操作符(、 -、 *、 /、 %) • - * / %操作符都是双⽬操作符,有**两个操作数**的符号就叫做双目操作符 10 4| || | 操作数1 操作数2// - % / * 以此类推•操作符也被叫做:运算符 1. 符号、符号 - 和 符号* •…...

华为OD机试 - 九宫格按键输入 - 逻辑分析(Java 2023 B卷 200分)

题目描述 九宫格按键输入,输出显示内容。有英文和数字两个模式,默认是数字模式。数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母。如果输入“/”或其他字符,则循环中断。 输入描述 输入范围为数字0…...

DeepSeek大模型在政务服务领域的应用

DeepSeek大模型作为国产人工智能技术的代表,近年来在政务服务领域的应用呈现多点开花的态势。通过多地实践,该技术不仅显著提升了政务服务的效率与智能化水平,还推动了政府治理模式的创新。以下从技术应用场景、典型案例及发展趋势三个维度进…...

卷积神经网络 - 一维卷积、二维卷积

卷积(Convolution),也叫褶积,是分析数学中一种重要的运算。在信号处理或图像处理中,经常使用一维或二维卷积,本博文我们来学习一维卷积和二维卷积。 理解一维卷积和二维卷积的核心在于把握维度对特征提取方式的影响。我们从数学定…...

【NLP 33、实践 ⑦ 基于Triple Loss作表示型文本匹配】

目录 一、配置文件 config.py 二、 数据加载文件 loader.py 1.加载数据 Ⅰ、加载字表或词表 Ⅱ、加载标签映射表 Ⅲ、封装数据 2.处理数据 Ⅰ、补齐或截断 Ⅱ、定义类的特殊方法 ① 返回数据集大小 ② 生成随机训练样本 ③ 根据索引返回样本 Ⅲ、加载和处理训练样本和测试样本 …...

基于CNN的多种类蝴蝶图像分类

基于CNN的多种类蝴蝶图像分类🦋 基于卷积神经网络对64992786张图像,75种不同类别的蝴蝶进行可视化分析、模型训练及分类展示 导入库 import pandas as pd import os import matplotlib.pyplot as plt import seaborn as sns import numpy as np from …...

Linkreate wordpressAI智能插件-自动生成原创图文、生成关键词、获取百度搜索下拉关键词等

Linkreate wordpressAI插件核心功能亮点 文章生成与优化 自动化文章生成:利用 AI 技术,根据关键词生成高质量文章。 支持指定长度和要求,异步生成不阻塞操作。 且 AI 可自动生成精准的 tag 标签,利于 SEO 优化。 批量生成文章…...

uniapp-x web 开发警告提示以及解决方法

defineModel props...

​详细介绍 SetWindowPos() 函数

书籍:《Visual C 2017从入门到精通》的2.3.8 Win32控件编程 环境:visual studio 2022 内容:【例2.29】模态对话框 说明:以下内容大部分来自腾讯元宝。 ​1. 函数功能与用途 SetWindowPos() 是 Windows API 中用于动态调整窗口…...

SpringBoot桂林旅游景点导游平台开发与设计

一个基于SpringBoot开发的桂林旅游景点导游平台项目。该项目不仅功能全面,而且易于部署,适合初学者学习和进阶开发者参考。 项目概述 该项目旨在为用户提供一个便捷的桂林旅游景点信息查询与线路推荐平台。系统分为管理员模块和用户模块,分…...

深入理解传输层协议

各类资料学习下载合集 ​​​​​​https://pan.quark.cn/s/8c91ccb5a474​​ 传输层是计算机网络中的一个重要层次,其主要任务是为应用层提供可靠的数据传输服务。传输层的协议主要包括 TCP(传输控制协议)和 UDP(用户数据报协议)。本文将详细解析这两种协议的特点、使用…...

基于金融产品深度学习推荐算法详解【附源码】

深度学习算法说明 1、简介 神经网络协同过滤模型(NCF) 为了解决启发式推荐算法的问题,基于神经网络的协同过滤算法诞生了,神经网络的协同过滤算法可以 通过将用户和物品的特征向量作为输入,来预测用户对新物品的评分,从而解决…...

java 中散列表(Hash Table)和散列集(Hash Set)是基于哈希算法实现的两种不同的数据结构

在 Java 中,散列表(Hash Table)和散列集(Hash Set)是两种不同的数据结构,但它们都基于哈希表的原理来实现。下面是它们的联系与区别、实现类以及各自的优缺点,并用表格进行对比整理。 联系与区…...

Tauri + Vite + SvelteKit + TailwindCSS + DaisyUI 跨平台开发详细配置指南(Windows)

Tauri Vite SvelteKit TailwindCSS DaisyUI 跨平台开发详细配置指南(Windows) 本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议。转载请注明出处及本声明 原文链接:[你的文章链接] 🛠️ 环境准备 1. 安装核心工具…...

centos 7误删/bash 拯救方法

进入救援模式 1. 插入CentOS 7安装光盘,重启系统。在开机时按BIOS设置对应的按键(通常是F2等),将启动顺序调整为CD - ROM优先。 2. 系统从光盘启动后,选择“Troubleshooting”,然后选择“Rescue a Cent…...

协程池是调用端并发请求的缓释胶囊

hello, 我是马甲哥,这是我的第183篇原创文章,阅读时间3min,有用指数4颗星。 昨天"朝花夕拾"栏目倒腾了一款具有请求排队功能的并发受限服务器。 演示了互联网高并发请求,服务端遇到的现实情况(服务器高负载、…...

【渗透测试】webpack对于渗透测试的意义

作者 :Yuppie001 作者主页 : 传送 本文专栏 :Web漏洞篇 🌟🌟🌟🌟🌟🌟🌟🌟 webpack: 一.webpack是什么二.对于渗透测试的意义&#…...

举例说明 牛顿法 Hessian 矩阵

矩阵求逆的方法及示例 目录 矩阵求逆的方法及示例1. 伴随矩阵法2. 初等行变换法矩阵逆的实际意义1. 求解线性方程组2. 线性变换的逆操作3. 数据分析和机器学习4. 优化问题牛顿法原理解释举例说明 牛顿法 Hessian 矩阵1. 伴随矩阵法 原理:对于一个 n n n 阶方阵 A A...

VSTO(C#)Excel开发12:多线程的诡异

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

MambaVision:一种Mamba-Transformer混合视觉骨干网络

摘要 我们提出了一种新型混合Mamba-Transformer主干网络,称为MambaVision,该网络专为视觉应用而设计。我们的核心贡献包括重新设计Mamba公式,以增强其对视觉特征的高效建模能力。此外,我们还对将视觉Transformer(ViT&…...

目标跟踪之DeepSort算法(4)

目标跟踪之DeepSort 1 安装1.1 代码下载与安装1. 2 DeepSort检测流程1.3 模型初始化流程 2. 模型推理2.1 模型推理代码解析2.2 对预测结果跟踪代码解析2.3 轨迹预测2.4 轨迹跟踪2.5 轨迹与特征匹配2.6 计算轨迹与检测的特征余弦距离2.7 用轨迹与检测的马氏距离跟新cost_matrix矩…...

速通大厂测开

最近26届暑期实习招聘和25届春招已经开始,测开学习圈也有同学拿到offer了 今天分享一位25届秋招圈友快速拿到大厂测开offer的经历,希望对大家有所帮助 我是某211本科生,在去年暑假准备考研的间隙意外收获了某大厂测开实习offer,…...

LightRAG简要概述

文章目录 索引流程问答流程naivelocalglobalhybridmix 中文prompt 官方仓库:LightRAG 没有废话,直接进入主题。 索引流程 1、提取实体与关系 2、LLM判断是否有漏掉的实体与关系,如有则接着提取 3、合并实体,根据多个实体描述&a…...

【Mac】安装 Parallels Desktop、Windows、Rocky Linux

一、安装PD 理论上,PD只支持试用15天!当然,你懂的。 第一步,在 Parallels Desktop for Mac 官网 下载 Install Parallels Desktop.dmg第二步,双击 Install Parallels Desktop.dmg 第三步,双击安装Paralle…...

Unity利用噪声生成动态地形

引言 在游戏开发中,地形是构建游戏世界的基础元素之一。传统的地形创建方法通常依赖于手动建模或预设资源,这种方式虽然精确但缺乏灵活性,且工作量巨大。而使用噪声算法生成地形则提供了一种程序化、动态且高效的解决方案。本文将详细介绍如…...

【Linux】Ext系列文件系统(上)

目录 一、 理解硬件 1-1 磁盘 1-2 磁盘物理结构 1-3 磁盘的存储结构 1-4 如何定位一个扇区 1-4 磁盘的逻辑结构 1-4-1 理解过程 1-4-2 真实过程 1-5 CHS && LBA地址 二、文件系统 2-1 "块"概念 2-2 "分区"概念 2-3 "inode"…...

解决diffusers加载stablediffusion模型,输入prompt总是报错token数超出clip最大长度限制

1. StableDiffusion1.5 在加载huggingface中的扩散模型时,输入prompt总是会被报错超过clip的最大长度限制。 解决方案:使用compel库 from diffusers import AutoPipelineForText2Image import torch import pdb from compel import Compeldevice torc…...

metersphere接口测试(1)使用MeterSphere进行接口测试

文章目录 前言接口文档单接口测试环境配置梳理接口测试场景测试接口 接口自动化怎么写复用性高的自动化测试用例 总结 前言 大汉堡工作第203天,本篇记录我第一次接触接口测试任务,最近有些懈怠啊~ 接口文档 首先就是接口地址,接口测试时用…...

Android第三次面试总结(网络篇)

在计算机网络领域,网络模型是理解通信原理的基础框架。本文将详细解析 OSI 参考模型和 TCP/IP 模型的分层结构、核心功能及实际应用,并通过对比帮助读者建立完整的知识体系。 一、OSI 参考模型:七层架构的理论基石 OSI(开放系统…...

AirtestIDE用法

包括airtest和poco 1. airtest 安装python3.7.9 64 python3 -m pip install -U airtest 或者: git clone https://github.com/AirtestProject/Airtest.git pip install -e airtest 无界面的airtest用法: 打开手机中的 开发者选项 , 以及 允许USB调…...

【面试手撕】非常规算法,多线程常见手撕题目

【面试手撕】非常规算法,多线程常见手撕题目 生产者消费者ReentrantLock实现的生产苹果/消费苹果synchronized实现的生产消费LinkedBlockingQueue阻塞队列方法实现多条件资源分配分布式任务调度模拟 交替打印两个线程交替打印1-100之间的数ReentrantLock 实现synchr…...

MySQL复合查询

目录 多表查询 自连接 子查询 单行子查询 多行子查询 in关键字 all关键字 any关键字 多列子查询 from中使用子查询 合并查询 union 操作符 union all 操作符 内外连接 内连接 外连接 左外连接 右外连接 前几期我们已经学习了MySQL的基本查询&…...

登录Xshell主机及Linux基本指令

✅博客主页:爆打维c-CSDN博客​​​​​​ 🐾 🔹分享c、c知识及代码 🐾 🔹Gitee代码仓库 五彩斑斓黑1 (colorful-black-1) - Gitee.com 一、操作系统简介 Linux其实跟我们熟知的Window一样,它们都是操作系统。 &#x…...

[LevelDB]关于LevelDB存储架构到底怎么设计的?

本文内容组织形式 LevelDB 存储架构重要特点总体概括LevelDB中内存模型MemTableMemTable的数据结构背景:SkipListSkiplist的数据结构 Skiplist的数据访问细节 SkipList的核心方法Node细节源代码 MemTable的数据加速方式Iterator 的核心方法 MemTable 的读取&写入…...

深入解析 React Diff 算法:原理、优化与实践

深入解析 React Diff 算法:原理、优化与实践 1. 引言 React 作为前端领域的标杆框架,采用 虚拟 DOM(Virtual DOM) 来提升 UI 更新性能。React 的 Diff 算法(Reconciliation) 是虚拟 DOM 运行机制的核心&a…...

【从零开始】Air780EPM的LuatOS二次开发——OneWire协议调试注意事项!

当涉及到与传感器、执行器等外部设备交互时,OneWire协议的高效调试成为决定项目成败的关键环节。OneWire协议(单总线协议)以其仅需一根数据线即可实现设备通信的极简特性,被广泛应用于温度传感器、身份识别模块等场景。 一、LuatO…...

响应(Response)

在 Flask 中,视图函数可以返回多种类型的响应,例如字符串、HTML、JSON、文件等。Flask 提供了 make_response 函数,用于生成和自定义 HTTP 响应。 2.1 默认响应 默认情况下,视图函数返回的字符串会被 Flask 包装成一个 HTTP 响应…...

C++学习之云盘项目fastDFS

1.资料介绍 1.1 一些概念 1. 什么是服务器 硬件 : 一台配置高的电脑 软件 : 电脑必须有一个能够解析 http 协议的软件 2. 常见的 Web 服务器 tomcat 服务器 apache 组织产品 , 开源的免费服务器 weblogic 服务器 bea 公司 , 收费的服务器 不交费 , 访问量受限…...

使用vue3+el-form实现动态新增名称,值,并对名称进行必填校验

使用vue3el-form实现动态新增名称&#xff0c;值&#xff0c;并对名称进行必填校验 效果图 代码 <template><el-form :model"form" :rules"rules" ref"dynamicForm"><!-- 动态添加的名称和值 --><el-row v-for"(ite…...