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

设计模式-适配器模式

适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端期望的另一个接口,使得原本不兼容的类可以协同工作。它的核心思想是通过中间层(适配器)解决接口不匹配的问题,类似于电源插头转换器。

核心思想

适配器模式通过以下方式实现接口的兼容:

  1. 定义目标接口(Target):客户端期望使用的接口。
  2. 引入适配者类(Adaptee):需要被适配的现有类(接口不兼容)。
  3. 创建适配器类(Adapter):将适配者的接口转换为目标接口。

适配器模式分为两种实现方式:

  • 类适配器:通过继承适配者类实现目标接口(需要支持多继承,Java中不适用)。
  • 对象适配器:通过组合(持有适配者的实例)实现目标接口(更灵活,推荐使用)。

适配器模式的结构

适配器模式包含以下角色:

  • 目标接口(Target)
    • 客户端期望使用的接口。
    • 定义客户端需要的方法。
  • 适配者类(Adaptee)
    • 需要被适配的现有类(接口与目标接口不兼容)。
  • 适配器类(Adapter)
    • 实现目标接口,并持有适配者的实例。
    • 在目标接口方法中调用适配者的方法,完成接口转换。

实现示例

假设有一个欧洲标准的插座(220V),而客户端需要一个美国标准的插座(110V)。通过适配器模式实现电压转换。
(1)目标接口(Target)

// 客户端期望的接口:美国标准插座(110V)
public interface USPlug {void supplyPower110V();
}

(2)适配者类(Adaptee)

// 现有的欧洲标准插座(220V)
public class EUPlug {public void supplyPower220V() {System.out.println("提供220V电压");}
}

(3)适配器类(Adapter)

// 适配器:将欧洲插座转换为美国标准
public class EUToUSAdapter implements USPlug {private EUPlug euPlug; // 持有适配者的实例public EUToUSAdapter(EUPlug euPlug) {this.euPlug = euPlug;}@Overridepublic void supplyPower110V() {euPlug.supplyPower220V();System.out.println("通过适配器将220V转换为110V");}
}

(4)客户端代码(Client)

public class Client {public static void main(String[] args) {// 现有的欧洲插座EUPlug euPlug = new EUPlug();// 创建适配器,将欧洲插座转换为美国标准USPlug usPlug = new EUToUSAdapter(euPlug);// 客户端使用适配后的接口usPlug.supplyPower110V();}
}

输出结果:

提供220V电压
通过适配器将220V转换为110V

适配器模式的优点

  1. 接口兼容
    使原本不兼容的类可以协同工作。

  2. 复用现有代码
    无需修改适配者的代码,直接通过适配器复用功能。

  3. 灵活扩展
    可以适配多个不同的类,甚至结合其他模式(如工厂模式)动态选择适配器。

适配器模式的缺点

  1. 增加复杂性
    引入适配器类会增加代码层级,可能使系统变得复杂。

  2. 性能开销
    额外的适配器调用可能带来轻微的性能损耗(通常可忽略)。

类适配器 vs 对象适配器

类适配器(Java中不可用,需多继承)

public class Adapter extends Adaptee implements Target {@Overridepublic void targetMethod() {super.adapteeMethod();}
}

对象适配器(推荐使用)

public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void targetMethod() {adaptee.adapteeMethod();}
}

适配器模式的实际应用

  • Java中的InputStreamReader和OutputStreamWriter
    将字节流(InputStream/OutputStream)适配为字符流(Reader/Writer)。

    Reader reader = new InputStreamReader(new FileInputStream("file.txt"), "UTF-8");
    
  • Spring框架中的HandlerAdapter
    在Spring MVC中,HandlerAdapter将不同类型的处理器(如Servlet、Controller)适配为统一的处理接口。

  • Android中的RecyclerView.Adapter
    将数据集合适配为RecyclerView可显示的视图项。

应用场景

  1. 系统升级或整合
    旧系统与新系统接口不兼容时,通过适配器过渡。

  2. 第三方库适配
    使用第三方库时,接口与现有代码不匹配。

  3. 统一多个类的接口
    需要将多个不同接口的类统一为同一接口供客户端使用。

总结

适配器模式是解决接口不兼容问题的利器,通过中间层(适配器)实现接口转换。它在系统升级、整合第三方库等场景中广泛应用,是提升代码复用性和灵活性的重要手段。

相关文章:

设计模式-适配器模式

适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端期望的另一个接口,使得原本不兼容的类可以协同工作。它的核心思想是通过中间层(适配器)解决接口不匹配的问题,类似于电源插头转换器。 核心思想 适配…...

MacBook部署达梦V8手记

背景 使用Java SpringBootDM开发Web应用,框架有License,OSX加载dll失败,安装了Windows 11,只有一个C盘,达梦安装后因为C盘权限问题,创建数据库失败,遂采用Docker容器方式部署。 下载介质 官网在…...

MySQL程序

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. mysqld (MySQL服务器) mysqld也被称为MySQL服务器,是⼀个多线程程序,对数据⽬录进⾏访问管理(包含数据库…...

APB-清华联合腾讯等机构推出的分布式长上下文推理框架

APB (Accelerating Distributed Long-Context Inference by Passing Compressed Context Blocks acrossGPUs)是清华大学等机构联合提出的分布式长上下文推理框架。通过稀疏注意力机制和序列并行推理方式,有效解决了大模型处理长文本时的效率瓶颈。APB采用更小的Anch…...

python爬虫笔记(一)

文章目录 html基础标签和下划线无序列表和有序列表表格加边框 html的属性a标签(网站)target属性换行线和水平分割线 图片设置宽高width,height html区块——块元素与行内元素块元素与行内元素块元素举例行内元素举例 表单from标签type属性pla…...

Pycharm接入DeepSeek,提升自动化脚本的写作效率

一.效果展示: 二.实施步骤: 1.DeepSeek官网创建API key: 创建成功后,会生成一个API key: 2. PyCharm工具,打开文件->设置->插件,搜索“Continue”,点击安装 3.安装完成后&…...

spring boot 过滤器简单demo

1. 过滤器(Filter)的概念 过滤器是 Java Web 应用中的一种组件,它可以在请求到达目标资源(如 Controller)之前或响应返回客户端之后,对请求和响应进行统一处理。它的核心作用是对 HTTP 请求和响应进行拦截…...

3.8 Spring Boot监控:Actuator+Prometheus+Grafana可视化

在Spring Boot应用中,通过整合Actuator、Prometheus和Grafana可以构建完整的监控体系,实现指标采集、存储和可视化。以下是具体实现步骤: 一、Spring Boot Actuator 配置 作用:暴露应用健康指标、性能数据等监控端点。 1. 添加依…...

C++中的单例模式及具体应用示例

AI 摘要 本文深入探讨了C中的单例模式及其在机器人自主导航中的应用,特别是如何通过单例模式来管理地图数据。文章详细介绍了单例模式的基本结构、优缺点以及在多线程环境中的应用,强调了其在保证数据一致性和资源管理中的重要性。 接着,文章…...

网络编程——套接字、创建服务器、创建客户端

一、套接字 1.1什么是套接字 套接字文件,原本就是一个和管道文件类似,用来实现进程间通信的一个文件 既然有了管道文件,当时为什么还要开发套接字文件,去实现进程的通信 因为管道文件是半双工模式的 套接字文件是全双工模式的…...

【设计模式】3W 学习法深入剖析创建型模式:原理、实战与开源框架应用(含 Java 代码)

3W 学习法总结创建型模式(附 Java 代码实战及开源框架应用) 创建型模式主要关注 对象的创建,旨在提高代码的可复用性、可扩展性和灵活性。本文采用 3W 学习法(What、Why、How),深入分析 五大创建型模式&am…...

软考系统架构师考试目录(2023新版)

论文 2023下半年 开发:论面向对象设计的应用与实现大数据:论多数据源集成的应用与实现测试:论软件可靠性评价的设计与实现运维:论边云协同的设计与实现 2024上半年 大数据:Lambda架构,分层批处理层、加…...

Apifox Helper 自动生成API接口文档

在我们开发过程中我们在编写请求地址和编写请求参数的时候特别花费时间耗费了我们很多时间,作为一个程序员,更应该把精力时间集中在开发上, Apifox Helper 是 Apifox 团队针对 IntelliJ IDEA 环境所推出的插件,可以在 IDEA 环境中…...

MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.1 MySQL简介与应用场景

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.1 MySQL简介与应用场景1.1.1 MySQL的发展历程与市场地位1.1.2 MySQL的核心特性与技术优势1.1.2…...

电鱼智能EFISH-RK3576-SBC工控板已适配Android 14系统

EFISH-RK3576-SBC工控板此前已提供了Linux 6.1.57系统,为了满足更多客户的需求,电鱼智能近日又为其成功适配了Android 14系统——硬件性能卓越的核心板与Android 14的深度组合,将为用户带来更加流畅、开放、智能的使用体验。 一、高性能处理器…...

C++ 语法之函数和函数指针

在上一章中 C 语法之 指针的一些应用说明-CSDN博客 我们了解了指针变量&#xff0c;int *p;取变量a的地址这些。 那么函数同样也有个地址&#xff0c;直接输出函数名就可以得到地址&#xff0c;如下&#xff1a; #include<iostream> using namespace std; void fun() …...

LabVIEW生成EXE文件错误提示

在LabVIEW生成EXE时弹出 “The build is missing one or more source files or items the source files reference on disk”&#xff0c;表明项目中引用的某些文件&#xff08;如VI、子模块、依赖库或配置文件&#xff09;未被正确包含或路径丢失。以下是具体原因及解决方案&a…...

HTML,CSS,JavaScript

HTML:负责网页的结构(页面元素和内容)。 CSS:负责网页的表现(页面元素的外观、位置等页面样式&#xff0c;如:颜色、大小等)。 Javascript:负责网页的行为(交互效果)。 MDN前端开发文档(MDN Web Docs) HTML HTML(HyperText Markup Language):超文本标记语言超文本:超越了文本的…...

SpringCloud 学习笔记2(Nacos)

Nacos Nacos 下载 Nacos Server 下载 | Nacos 官网 下载、解压、打开文件&#xff1a; 更改 Nacos 的启动方式 Nacos 的启动模式默认是集群模式。在学习时需要把他改为单机模式。 把 cluster 改为 standalone&#xff0c;记得保存&#xff01; 启动startup.cmd Ubuntu 启动…...

Qt5.15.2实现Qt for WebAssembly与示例

目录 1.什么是Qt for WebAssembly&#xff1f; 1.1 什么是 WebAssembly&#xff1f; 1.2 WebAssembly 的优势 1.3 什么是 Qt for WebAssembly&#xff1f; 1.4 Qt for WebAssembly 的特点 1.5 编译过程 1.6 运行时环境 注意&#xff01;&#xff01;&#xff01;注意&am…...

荣耀手机怎么录制屏幕?屏幕录制后为视频加水印更有“安全感”

在数字时代&#xff0c;屏幕录制已经成为记录和分享信息的重要方式之一。无论是记录游戏的高光时刻&#xff0c;还是制作教学视频&#xff0c;亦或是保存重要的线上会议内容&#xff0c;屏幕录制都能轻松搞定。 荣耀手机作为一款功能强大的设备&#xff0c;自然也提供了便捷的…...

3DXML 与 SOLIDWORKS 格式转换:技术协同及迪威模型方案

一、引言 在产品设计的前沿领域&#xff0c;3DXML 与 SOLIDWORKS 作为主流格式&#xff0c;虽各有所长&#xff0c;但因格式差异&#xff0c;常成为数据流通与协作的阻碍。对于技术人员和学生党而言&#xff0c;掌握二者间的转换技术&#xff0c;不仅能提升设计效率&#xff0…...

CH347使用笔记:CH347结合STM32CubeIDE实现单片机下载与调试

目录 基于 STM32CubeIDE的 CH347 JTAG/SWD调试器使用说明1. CH347驱动安装与配置2. STM32CubeIDE调试器配置2.1 打开相关工程后&#xff0c;进行以下操作2.2 openocd.exe替换2.3 脚本添加2.4 更改调试器选择 3. 下载程序4. 使用过程中可能遇到的问题4.1 CH347未插入4.2 Openocd…...

JS—基本数据类型和引用数据类型:1分钟掌握两者的区别

个人博客&#xff1a;haichenyi.com。感谢关注 一. 目录 一–目录二–分类三–核心区别四–实际场景中的问题五–总结对比 二. 分类 前面说过这么判断数据类型&#xff0c;今天来说说基本数据类型和引用数据类型的区别。 基本数据类型引用数据类型StringObjectNumberFunct…...

使用 CryptoJS 实现 AES 解密:动态数据解密示例

在现代加密应用中,AES(高级加密标准)是一种广泛使用的对称加密算法。它的安全性高、效率好,适合用于各种加密任务。今天,我们将通过一个实际的示例,展示如何使用 CryptoJS 实现 AES 解密,解密动态数据。CryptoJS 是一个基于 JavaScript 的加密库,它支持 AES、DES 等多种…...

[设计模式与源码]1_Spring三级缓存中的单例模式

欢迎来到啾啾的博客&#x1f431;&#xff0c;一个致力于构建完善的Java程序员知识体系的博客&#x1f4da;&#xff0c;记录学习的点滴&#xff0c;分享工作的思考、实用的技巧&#xff0c;偶尔分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604…...

使用React和google gemini api 打造一个google gemini应用

实现一个简单的聊天应用&#xff0c;用户可以通过输入问题或点击“Surprise me”按钮获取随机问题&#xff0c;并从后端API获取回答。 import { useState } from "react"; function App() {const [ value, setValue] useState(""); // 存储用户输入的问题…...

为什么Django能有效防御CSRF攻击?

在当今这个互联网高度发达的时代&#xff0c;Web安全问题层出不穷&#xff0c;其中跨站请求伪造&#xff08;CSRF&#xff0c;Cross-Site Request Forgery&#xff09;就是一个比较常见的威胁。攻击者利用用户的身份信息&#xff0c;发送恶意请求&#xff0c;改变用户的属性或执…...

Oracle常见系统函数

一、字符类函数 1&#xff0c;ASCII(c)和CHR(i)字符串和ascii码互转换 SQL> select ascii(Z) ,ascii(H),ascii( A) from dual;ASCII(Z) ASCII(H) ASCII(A) ---------- ---------- ----------90 72 32SQL> select chr(90),chr(72),chr(65) from dual;C…...

【Visio使用教程】

Visio使用教程 1. Visio 的基本介绍1.1 Visio 是什么&#xff1f;核心特点&#xff1a; 1.2 主要功能与应用场景典型用途&#xff1a;行业应用&#xff1a; 1.3 版本与兼容性1.4 Visio下载1.5 安装 2. Visio 的界面与基础操作2.1 界面布局详解2.2 创建新文档与模板选择2.3 形状…...

蓝桥杯 修剪灌木

问题描述 爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修…...

HTML中滚动加载的实现

设置div的overflow属性&#xff0c;可以使得该div具有滚动效果&#xff0c;下面以div中包含的是table来举例。 当table的元素较多&#xff0c;以至于超出div的显示范围的话&#xff0c;观察下该div元素的以下3个属性&#xff1a; clientHeight是div的显示高度&#xff0c;scrol…...

bbbbb

import java.util.ArrayList; import java.util.List; public class KthPermutation { public static String getPermutation(int n, int k) { // 计算阶乘 int[] factorial new int[n]; factorial[0] 1; for (int i 1; i < n; i) …...

Linux文件

1.Open函数 高频使用的Linux系统调用&#xff1a;open write read close Linux自带的工具&#xff1a;man手册&#xff1a; man 1是普通的shell命令&#xff0c;比如ls man 2是系统调用函数&#xff0c;比如open&#xff0c;write说明 在Linux系统库的定义&#xff1a; int o…...

kafka指北

为自己总结一下kafka指北&#xff0c;会持续更新。创作不易&#xff0c;转载请注明出处。 目录 集群controller选举过程broker启动流程 主题创建副本分布ISRleader副本选举机制LEO 生产数据流程同步发送和异步发送 分区策略ack应答生产者发送消息的幂等性跨分区幂等性问题&…...

Linux安装部署Elasticsearch8 全过程记录

一、安装 Elasticsearch8 1、下载 访问 Elasticsearch 官方网站&#xff08;Download Elasticsearch | Elastic&#xff09;。 在下载页面找到 Elasticsearch 8 的 Linux 版本&#xff08;.tar.gz 格式&#xff09;下载链接&#xff0c;点击下载。 下载Elasticsearch8&…...

ESP32(3)UDP通信

对于 lwIP 的 Socket 的使用方式&#xff0c;它与文件操作非常相似。在文件操作中&#xff0c;我们首先打开文件&#xff0c;然后进行读/写操作&#xff0c;最后关闭文件。在TCP/IP网络通信中&#xff0c;也存在着相同的操作流程&#xff0c;但所使用的接口不再是文件描述符或 …...

汽车机械钥匙升级一键启动的优点

汽车机械钥匙升级一键启动的优点主要包括&#xff1a; 便捷性&#xff1a;一键启动功能的引入极大地提升了用车便捷性。车主无需翻找钥匙&#xff0c;只需在车辆感应范围内轻触启动键&#xff0c;即可轻松发动汽车。 安全性&#xff1a;移动管家专车专用一键启动系统配备了防…...

【matlab例程】三维下的TDOA定位和EKF轨迹滤波例程,TDOA的锚点数量可自定义(订阅专栏后可获得完整代码)

本文所述的MATLAB例程实现了TDOA定位和扩展卡尔曼滤波(EKF)来提高位置估计的准确性,并通过可视化结果进行分析。 文章目录 运行结果MATLAB代码程序讲解关键步骤和功能步骤解释注意事项总结运行结果 三维轨迹: 三维误差曲线: RMSE曲线: 命令行输出内容:...

个人blog系统 前后端分离 前端js后端go

系统设计&#xff1a; 1.使用语言&#xff1a;前端使用vue&#xff0c;并使用axios向后端发送数据。后端使用的是go的gin框架&#xff0c;并使用grom连接数据库实现数据存储读取。 2.设计结构&#xff1a; 最终展示&#xff1a;仅展示添加模块&#xff0c;其他模块基本相似 前…...

OSG简介

OSG OpenSceneGraph (简称 OSG) 是一个开源的高性能3D图形库。 作用 它为开发者提供了一个强大的API&#xff0c;处理和渲染复杂的3D图形。 特点 OSG基于OpenGL构建&#xff0c;提供了对现代图形技术的支持&#xff0c;如着色器、纹理映射、光照模型等高级特性。 跨平台支…...

社区版Uos20.9从源码编译QT5.15.2

主要是在这个文章上学的究极保姆式教你如何在Ubuntu上源码安装Qt5.15.2_ubuntu安装qt5.15.2-CSDN博客 但原文上在环境变量的配置上真用在 uso上好像不行&#xff0c;要加一些引号和$号。原文的测试编译代码也有些问题&#xff0c;include上少了类。略作修改&#xff0c;在UOS社…...

AI学习第二天--大模型压缩(量化、剪枝、蒸馏、低秩分解)

目录 1. 量化&#xff1a;压缩大象的“脂肪” 比喻 技术逻辑 2. 剪枝&#xff1a;修剪大象的“无效毛发” 比喻 技术逻辑 3. 知识蒸馏&#xff1a;让大象“师从巨象” 比喻 技术逻辑 4. 低秩分解&#xff1a;把大象“折叠成纸偶” 比喻 技术逻辑 5. 推理优化&#…...

C++ —— 线程同步(互斥锁)

C —— 线程同步&#xff08;互斥锁&#xff09; 线程同步互斥锁&#xff08;互斥量&#xff09;测试代码mutex互斥锁 线程同步 线程同步&#xff1a;多线程协同工作&#xff0c;协商如何使用共享资源。 C11线程同步包含三部分内容&#xff1a; 互斥锁&#xff08;互斥量&…...

相对路径跳转和绝对路径跳转有什么区别?

在 Vue 3 中使用路由跳转时&#xff0c;相对路径跳转和绝对路径跳转在使用方式、适用场景等方面存在明显区别&#xff0c;以下为你详细介绍&#xff1a; 定义 绝对路径跳转&#xff1a;指的是使用完整的路径来进行路由导航&#xff0c;路径以 / 开头&#xff0c;无论当前处于…...

Flume详解——介绍、部署与使用

1. Flume 简介 Apache Flume 是一个专门用于高效地 收集、聚合、传输 大量日志数据的 分布式、可靠 的系统。它特别擅长将数据从各种数据源&#xff08;如日志文件、消息队列等&#xff09;传输到 HDFS、HBase、Kafka 等大数据存储系统。 特点&#xff1a; 可扩展&#xff1…...

笔记类AI应用体验

笔记类AI应用体验 叮当好记视频一键转笔记&#xff0c; 祝你学习效率起飞 IMAGet笔记印象笔记&#xff08;Evernote&#xff09;&#xff1a;Notion&#xff1a;Trilium Notes&#xff1a;二、开始搭建三、搭建步骤四、创建博客 Obsidian&#xff1a;案例让ai帮我执行大模型学习…...

Mysql篇——SQL优化

本篇将带领各位了解一些常见的sql优化方法&#xff0c;学到就是赚到&#xff0c;一起跟着练习吧~ SQL优化 准备工作 准备的话我们肯定是需要一张表的&#xff0c;什么表都可以&#xff0c;这里先给出我的表结构&#xff08;表名&#xff1a;userinfo&#xff09; 通过sql查看…...

【css酷炫效果】纯CSS实现故障文字特效

【css酷炫效果】纯CSS实现故障文字特效 缘创作背景html结构css样式完整代码基础版进阶版(3D效果) 效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492053 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚…...

【Java】链表(LinkedList)(图文版)

本博客总结了Java当中链表的实现&#xff0c;以及相关方法的使用&#xff0c;在最后附带了一些常见链表相关处理技巧&#xff0c;希望对你有帮助&#xff01; ps&#xff1a;可拷贝到IDEA上自行测试&#xff0c;代码全部完成测试。 一.链表概述 1.什么是链表&#xff1f; 链…...