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

适配器模式:让不兼容的接口协同工作

在面向对象设计中,适配器模式是一种常见的结构型设计模式。它允许将不兼容的接口转换成客户端所期望的另一个接口,从而使不同的类协同工作。适配器模式的主要目的是解决不同接口之间的兼容性问题,同时也提高了代码的可重用性和灵活性。

问题引入

在软件开发中,经常会遇到需要集成不同模块、类或库的情况。然而,这些不同的模块可能使用不同的接口,导致难以直接协同工作。在这种情况下,适配器模式可以派上用场。

适配器模式的构成

适配器模式由以下几个组件组成:

  1. 目标接口(Target Interface): 目标接口是客户端所期望的接口,适配器将目标接口与被适配的类连接起来。

  2. 被适配的类(Adaptee): 被适配的类是需要适配的类,它具有不兼容的接口。

  3. 适配器(Adapter): 适配器是连接目标接口和被适配的类的类。它实现了目标接口,并在内部包装了被适配的类的实例,以实现接口的转换。

示例应用

假设你正在开发一个音频播放器应用程序,其中使用了不同的音频格式(如MP3、WAV、FLAC)。每种音频格式都有各自的播放方法。现在,你想要为应用程序添加一个新的音频格式,但这个格式的播放方法与现有格式不同。在这种情况下,适配器模式可以派上用场。

实际示例

adapts
AudioPlayer
+play(audioType, file)
Mp3Player
+playMp3(file)
AdvancedAudioPlayer
+playVlc(file)
+playMp4(file)
VlcPlayer
+playVlc(file)
+playMp4(file)
VlcPlayerAdapter
- advancedAudioPlayer
+play(audioType, file)
// 目标接口:音频播放器
interface AudioPlayer {void play(String audioType, String fileName);
}// 具体类:MP3播放器
class Mp3Player implements AudioPlayer {@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("mp3")) {System.out.println("Playing MP3 file: " + fileName);}}
}// 适配器接口:高级音频播放器
interface AdvancedAudioPlayer {void playVlc(String fileName);void playMp4(String fileName);
}// 具体类:VLC播放器
class VlcPlayer implements AdvancedAudioPlayer {@Overridepublic void playVlc(String fileName) {System.out.println("Playing VLC file: " + fileName);}@Overridepublic void playMp4(String fileName) {// Do nothing}
}// 适配器类:适配VLC播放器为AudioPlayer
class VlcPlayerAdapter implements AudioPlayer {private AdvancedAudioPlayer advancedAudioPlayer;public VlcPlayerAdapter(AdvancedAudioPlayer advancedAudioPlayer) {this.advancedAudioPlayer = advancedAudioPlayer;}@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("vlc")) {advancedAudioPlayer.playVlc(fileName);}}
}public class Main {public static void main(String[] args) {AudioPlayer audioPlayer = new Mp3Player();audioPlayer.play("mp3", "song.mp3");AdvancedAudioPlayer vlcPlayer = new VlcPlayer();AudioPlayer vlcAdapter = new VlcPlayerAdapter(vlcPlayer);vlcAdapter.play("vlc", "movie.vlc");}
}

结论

适配器模式是一个强大的工具,可以在不改变现有代码的情况下,让不兼容的类和接口协同工作。它提供了一种有效的方式来集成不同的模块和组件,从而提高了代码的可维护性和扩展性。

适配器模式的应用不仅仅局限于音频播放器,它可以在各种场景中发挥作用,特别是在需要集成第三方库、遗留代码或不同版本组件的情况下。

在设计和开发中,了解适配器模式的原理和用法,将使你能够更好地解决接口兼容性问题,实现代码的灵活和可维护性。

相关文章:

适配器模式:让不兼容的接口协同工作

在面向对象设计中,适配器模式是一种常见的结构型设计模式。它允许将不兼容的接口转换成客户端所期望的另一个接口,从而使不同的类协同工作。适配器模式的主要目的是解决不同接口之间的兼容性问题,同时也提高了代码的可重用性和灵活性。 问题…...

【1day】复现Milesight-VPNserver.js 任意文件读取漏洞

目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现 一、漏洞描述 Milesight路由器-VPN是由Milesight Technology Co., Ltd.开发的一种集成了VPN功能的路由器产品。它旨在为用户提供安全、可靠的远程访问和连接解决方案。Milesight-VPNserver.js存在任意文件读取…...

前端代码规范

1 husky husky用于绑定git hooks,在指定时机执行想要的命令 {"husky": {"hooks": {"pre-commit": "lint-staged" }} }需要手动修改.husky文件内容: . "$(dirname -- "$0")/_/husky.sh"n…...

Java接入文心一言

文章目录 文心一言应用创建接口对接接口文档代码示例依赖 常量类实体类 结束语 文心一言应用创建 首先需要先申请文心千帆大模型,申请地址:文心一言 (baidu.com),点击加入体验,等通过审核之后就可以进入文心千帆大模型后台进行应…...

信息管理系统三级等保的一些要求

一、前言 在做一些互联网系统或面向互联网的系统时,需要进行备案,需要满足网络信息安全维护规章及有关规章制度要求,才能发布到互联网。所以在做系统的需求分析时,往往需要把信息管理系统三级等保的需求加上,方便开发…...

第六届“蓝帽杯”电子取证模块(初赛)解析+全资源一次性分享

前言:资源一次性分享 手机+电脑+exe+内存四个模块,我自己在网上也找了很久,才把资源找齐全,题目我也整理在这里,方便大家训练。 目录...

《Go 语言第一课》课程学习笔记(九)

常量:Go 在“常量”设计上的创新有哪些? Go 语言在常量方面的创新包括下面这几点: 支持无类型常量;支持隐式自动转型;可用于实现枚举。 常量 Go 语言的常量是一种在源码编译期间被创建的语法元素。这是在说这个元素…...

docker 安装nginx 和 elasticsearch ik 自定义分词

1、切换到/mydata 文件夹 创建 nginx 目录 mkdir nginx 2、运行 docker run --name nginx -p 80:80 -d nginx:1.22.0 3、复制docker 里面的nginx配置到 外面的nginx/conf 下面 docker cp nginx:/etc/nginx /mydata/nginx 4、把 /mydata/nginx下面的nginx 改…...

谈谈收音机的发展

目录 1.什么是收音机 2.收音机的工作原理 3.收音机的发展历史 4.收音机的历史作用 1.什么是收音机 收音机是一种电子设备,用于接收和播放广播电台的无线电信号。它是人们获取各种音乐、新闻、娱乐和其他广播节目的常用设备。 收音机通常由以下几个部分组成&…...

QTreeWidget——信号处理

文章目录 基本属性信号一、信号种类二、信号测试1、currentItemChanged、itemCollapsed、itemExpanded三个信号的测试2、itemActivated信号3、 itemChanged信号4、其余信号的测试代码(包含以上代码) 基本属性 信号 一、信号种类 //当前项发生变化时触…...

【Java从入门到精通|1】从特点到第一个Hello World程序

写在前面 在计算机编程领域,Java是一门广泛应用的高级编程语言。它以其强大的跨平台性能、丰富的库和生态系统以及易于学习的语法而备受开发者欢迎。本文将引导您逐步了解Java的特点、如何安装和配置开发环境,以及如何编写您的第一个Java程序。 一、Java…...

JAVA 读取jar包中excel模板

1、在resources路径下,新建report文件夹,放入excel模板 2、配置文件中的目录,分隔符使用 / template: /report/报告模板V1.0.xlsx3、使用getResourceAsStream()读取 XSSFWorkbook wb;try {//需要以/开始InputStream resourceAsStream this.g…...

解决方案:fatal error: openssl/bio.h: 没有那个文件或目录

出现报错如下: 出现该错误的原因有两个: 没有安装openssl或者libssl-dev库Libssl-dev版本过高,需要降级 一. 没有安装openssl或者libssl-dev库 使用指令安装openssl: 我的是已经安装完成了,所以再把libssl-dev的库也…...

【MySQL系列】ALTER语句详解,以及UPDATE,DELECT,TRUNCATE语句的使用+区别

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

c++关键字 =delete和=default

在C的类中,有四类特殊的成员函数:① 默认构造函数;② 拷贝构造函数;③ 拷贝赋值函数(operator);④ 析构函数;它们控制着类的实例的创建、初始化、拷贝以及销毁。 (1&…...

idea 左下角的Git(Version Control)中显示Local Changes窗口

打开Local Changes窗口来查看当前Git仓库的本地变更。 使用快捷键: - Windows: Alt9 - Mac: Cmd9 解决: (1)idea打开settings (2)点击Version Control窗口选项卡,选择Commit选项,对 Use.... in…...

.net老项目中Jquery访问webservice

.net老项目中Jquery访问webservice 1. xml类型返回 jQuery.ajax({type: "POST",async: false,url: "WebService/Evection.asmx/GetCheckUpApplyEForm",contentType: "application/json",data: "{lngEvectionID:" eformSNOriginal &…...

SpringBoot项目集成ElasticSearch服务

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍优势说明集成过程1.引入依赖2.添加配置文件3.初始化 示例说明代码结果 总结提升 版本介绍 Spring boot的版本是: 2.3.12   ElasticSearch的版本是:7.6.2 背景介绍 在我们的项目中经常会遇到对于…...

2023年网络安全比赛--综合渗透测试(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.扫描目标靶机将靶机开放的所有端口,当作flag提交(例:21,22,23); 2.扫描目标靶机将靶机的http服务版本信息当作flag提交(例:apache 2.3.4); 3.靶机网站存在目录遍历漏洞,请将…...

一次网络不通“争吵“引发的思考

作者: 郑明泉、余凯 为啥争吵,吵什么? “你到底在说什么啊,我K8s的ecs节点要访问clb的地址不通和本地网卡有什么关系…” 气愤语气都从电话那头传了过来,这时电话两端都沉默了。过了好一会传来地铁小姐姐甜美的播报声…...

PostgreSQL 与 MySQL InnoDB 隔离级别 MVCC 核心对比

一、数据库标准四大隔离级别 SQL 标准定义 4 个隔离级别,从低到高: 读未提交(Read Uncommitted)读已提交(Read Committed,RC)可重复读(Repeatable Read,RR)串…...

Windows右键菜单为何变得臃肿?ContextMenuManager帮你重新掌控

Windows右键菜单为何变得臃肿?ContextMenuManager帮你重新掌控 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾为Windows右键菜单的混乱而烦…...

ARM Trace Address Comparator寄存器原理与应用

1. ARM Trace Address Comparator寄存器详解在嵌入式系统调试和性能分析领域,地址比较器(Address Comparator)是一个至关重要的硬件组件。作为ARM CoreSight调试架构的一部分,Trace Address Comparator寄存器组为开发者提供了精确控制指令流追踪的能力。…...

BG3ModManager终极指南:如何轻松管理博德之门3模组避免游戏崩溃?

BG3ModManager终极指南:如何轻松管理博德之门3模组避免游戏崩溃? 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager BG3ModMana…...

数据库完整性约束与安全机制全解析

一、数据库完整性约束1、数据库完整性基本概念与核心机制(1)完整性定义与作用数据库完整性(Database Integrity)是指在任何情况下保证数据的正确性(Validity)和一致性(Consistency)&…...

Python开发进阶之路:探索异步编程与高性能应用

在当今快节奏的软件开发环境中,构建高性能、可扩展的应用程序已成为开发者的首要任务。随着互联网应用的普及,用户对响应速度和并发处理能力的要求越来越高。Python,作为一种广泛使用的高级编程语言,凭借其简洁的语法和强大的生态…...

VSCode调试C++项目全攻略:从CMake工程配置到Native Debug实战(含传参技巧)

VSCode调试C项目全攻略:从CMake工程配置到Native Debug实战(含传参技巧) 在当今的C开发环境中,高效调试已成为提升生产力的关键环节。对于使用CMake管理的中大型项目,如何在VSCode中实现无缝调试体验,是许多…...

抖音无水印下载神器:douyin-downloader完整指南,轻松保存高清视频

抖音无水印下载神器:douyin-downloader完整指南,轻松保存高清视频 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and …...

Arm编译器在嵌入式开发中的优化实践

1. Arm编译器嵌入式开发环境概述在嵌入式系统开发领域,工具链的选择往往决定了最终产品的性能上限。作为Arm架构的"原生"编译器,Arm Compiler for Embedded凭借其深度优化的代码生成能力,在物联网设备、工业控制器等资源受限场景中…...

TextInputLayout实战:从属性解析到自定义样式进阶

1. TextInputLayout基础入门:从零开始掌握Material输入框 第一次接触TextInputLayout时,我被它丝滑的浮动提示动画惊艳到了。相比传统的EditText,这个Material Design组件确实能让表单界面瞬间提升好几个档次。记得去年做登录页面重构时&…...