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

编程-设计模式 6:适配器模式

设计模式 6:适配器模式

定义与目的
  • 定义:适配器模式将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
  • 目的:该模式的主要目的是解决接口不匹配的问题,使得一个已经存在的类可以被新的环境所接受。
实现示例

假设我们有一个老版本的音频播放器,它只能播放 MP3 格式的文件,但现在我们需要它也能播放 WAV 格式的文件。我们可以使用适配器模式来解决这个问题。

// 定义目标接口
public interface AudioPlayer {void play(String audioType, String fileName);
}// 定义已有的MP3播放器类
public class Mp3Player implements AudioPlayer {@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("mp3")) {System.out.println("Playing mp3 file. Name: " + fileName);} else {System.out.println("Invalid audio format");}}
}// 定义WAV文件接口
public interface AdvancedAudioPlayer {void playWav(String fileName);
}// 定义WAV播放器类
public class WavePlayer implements AdvancedAudioPlayer {@Overridepublic void playWav(String fileName) {System.out.println("Playing wav file. Name: " + fileName);}
}// 定义适配器类
public class AudioAdapter implements AudioPlayer {private AdvancedAudioPlayer advancedAudioPlayer;public AudioAdapter(AdvancedAudioPlayer advancedAudioPlayer) {this.advancedAudioPlayer = advancedAudioPlayer;}@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("wav")) {advancedAudioPlayer.playWav(fileName);} else {System.out.println("Invalid audio format");}}
}// 客户端代码
public class Client {public static void main(String[] args) {AudioPlayer audioPlayer = new Mp3Player();audioPlayer.play("mp3", "beyond_the_river.mp3");AdvancedAudioPlayer wavePlayer = new WavePlayer();AudioPlayer audioAdapter = new AudioAdapter(wavePlayer);audioAdapter.play("wav", "beyond_the_river.wav");}
}
使用场景
  • 当你需要重用一些已有的类,但它们的接口与你的系统不兼容时。
  • 当你想创建一个可以复用的类,该类可以与其他无关的类或不可预见的类(即那些接口不兼容的类)协同工作时。

适配器模式通过包装一个已有的类来实现一个新的接口,从而解决了接口不兼容的问题。这使得原本不兼容的类可以协同工作,提高了系统的灵活性。

小结

适配器模式是一种常用的结构型模式,它可以帮助你解决接口不兼容的问题,使得现有类可以适应新的环境。通过使用适配器模式,你可以轻松地将已有的类集成到新的系统中,而不需要修改它们的源代码。

相关文章:

编程-设计模式 6:适配器模式

设计模式 6:适配器模式 定义与目的 定义:适配器模式将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。目的:该模式的主要目的是解决接口不匹配的问题,使得一个…...

ERC721 概念解释

目录 FeaturesVotesAccess ControlUpgradeabilityFeatures Mintable: 允许创建新的代币(minting)。合约的所有者或有权限的账户可以调用 mint 函数来生成新的代币,并将其分配给指定的地址。 Auto Increment Ids:自动递增 ID。每次创建新的代币时,代币的 ID 会自动递增,确保…...

数据结构(其五)--串

目录 12.串 12.1 基本操作 12.2 串的存储结构 12.3 字符串的模式匹配算法 (1).朴素模式匹配算法 (2).KMP算法 i.next[]数组的求解 ii.next[]数组的优化——nextval数组 iii.手算nextval数组 iiii.机算nextval数组 + KMP函数 12.串 串,即字符串(string),由零个或多…...

LeetCode Hot100 LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -…...

GESP C++ 2024年06月一级真题卷

一、单选题(每题 2 分,共 30 分) 第 1 题 在 C 中,下列不可做变量的是 ( ) 。 A. five-Star B. five_star C. fiveStar D. _fiveStar 答案:A 解析:标识符命名规则,标识符由字母、数…...

在 Ubuntu Server 上配置静态 IP 地址

在 Ubuntu Server 上配置静态 IP 地址 测试时使用的Ubuntu server版本是22.04 一、Ubuntu 17.10之前版本 使用 ifupdown 配置文件来设置静态 IP。配置文件通常位于 /etc/network/interfaces。 1.1 编辑 /etc/network/interfaces 文件: sudo vim /etc/network/in…...

数据结构——栈的讲解(超详细)

前言: 小编已经在前面讲完了链表和顺序表的内容,下面我们继续乘胜追击,开始另一个数据结构:栈的详解,下面跟上小编的脚步,开启今天的学习之路! 目录 1.栈的概念和结构 1.1.栈的概念 1.2.栈的结构…...

三防平板助力MES系统,实现工厂移动式生产报工

在当今竞争激烈的制造业环境中,提高生产效率、优化生产流程以及实现精准的生产管理已经成为企业生存和发展的关键。 MES系统作为连接企业计划层和控制层的桥梁,在实现生产过程的信息化、数字化和智能化方面发挥着重要作用。与此同时,三防平板…...

WEB渗透Bypass篇-常规函数绕过

常规函数绕过 <?php echo exec(whoami);?> ------------------------------------------------------ <?php echo shell_exec(whoami);?> ------------------------------------------------------ <?php system(whoami);?> ------------------------…...

C++从入门到起飞之——string类的模拟实现 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、多文件之间的关系 2、模拟实现常用的构造函数 2.1 无参构造函数 2.2 有参的构造函数 2.3 析构函…...

数据库国产化大趋势下,还需要学习Oracle吗?

由于众所周知的原因&#xff0c;近两年各行各业都开始了数据库国产化替代的进程&#xff0c;从国外商业数据库替换到国产或者开源数据库&#xff0c;相信很多的数据库从业人员会把部分精力转移到其他数据库产品的学习中&#xff0c;也有一些人在大肆的宣扬Oracle已经过时了&…...

WebLogic

二、WebLogic 2.1 后台弱口令GetShell 漏洞描述 通过弱口令进入后台界面&#xff0c;上传部署war包&#xff0c;getshell 影响范围 全版本(前提后台存在弱口令) 漏洞复现 默认账号密码:weblogic/Oracle123weblogic常用弱口令: Default Passwords | CIRT.net这里注意&am…...

Aspose.Words.dll 插入模板表格,使用的是邮件合并MailMerge功能,数据源是DataTable或list对象,实例

本实例中的实例功能有: 1、 Aspose.Words.dll 插入模板指定域替换为文字或html标签,见1 2、Aspose.Words.dll 插入模板表格,使用的是邮件合并MailMerge功能,数据源是DataTable或List对象(将list转换成DataTable),见1和2 3、word转换Pdf文件,见1 4、将多个word输出文…...

同时打开多个微信

注&#xff1a; 以下方法用到的 D:\微信\WeChat\WeChat.exe是我的电脑微信路径&#xff0c;可右击桌面微信快捷方式 > 属性 > 目标查看 以下方法都需要先关掉已登录的微信后操作 <一> 找到微信路径 新建一个txt文件输入以下内容 start D:\微信\WeChat\WeChat.exe …...

MPU6050的STM32数据读取

目录 1. 概述2. STM32G030对MPU6050的读取3. STM32F1xx对MPU6050的读取 1. 概述 项目中&#xff0c;往往需要根据不同的环境使用不同的芯片处理某些数据&#xff0c;当使用不同的芯片对六轴陀螺仪芯片MPU6050进行数据处理中&#xff0c;硬件的连接、I/O口的设置往往需要根据相…...

【微信小程序开发】——奶茶点餐小程序的制作(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

Java 文件上传七牛云

Java系列文章目录 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 新建空间4.2 查找密钥4.3 进入开发者中心查找JavaSDK文档4.4 查找文件上传方法4.5 运行测试 五、总结&#xff1a;5.1 学习总结&#xff1a; 一、前言 学…...

大语言模型生成无人系统(如机械臂、无人机等)可以执行的指令序列

大语言模型生成无人系统&#xff08;如机械臂、无人机等&#xff09;可以执行的指令序列涉及将自然语言指令转化为具体的、可执行的指令集合。以下是一个详细的流程&#xff0c;展示了如何从自然语言指令生成无人系统的执行指令序列。 1. 输入自然语言指令 用户输入自然语言指…...

尚硅谷谷粒商城项目笔记——十、调试前端项目renren-fast-vue【电脑CPU:AMD】

十、调试前端项目renren-fast-vue 如果遇到其他问题发在评论区&#xff0c;我看到后解决 1 先下载安装git git官网下载地址 2 登录gitee搜索人人开源找到renren-fast-vue复制下载链接。【网课视频中也有详细步骤】 3 下载完成后桌面会出现renren-fast-vue的文件夹 4 开始调…...

Python 的元组和列表的区别是什么?

以下是 Python 中元组&#xff08;tuple&#xff09;和列表&#xff08;list&#xff09;的主要区别&#xff1a; 1. 语法表示&#xff1a;元组使用小括号 () 来定义&#xff0c;例如 (1, 2, 3) &#xff1b;列表使用方括号 [] 来定义&#xff0c;例如 [1, 2, 3] 。 2. 可变性…...

Vue 3 useModel与defineModel实战对比:如何根据项目需求选择最佳双向绑定方案

1. Vue 3双向绑定技术演进与核心概念 双向数据绑定一直是Vue框架的核心特性之一。在Vue 3.4版本中&#xff0c;官方引入了两种新的实现方式&#xff1a;useModel和defineModel。这两种API虽然目标相同&#xff0c;但在使用场景和实现方式上存在明显差异。 要理解它们的区别&…...

3张表搞定财务BP工作!财务BP必须会的3张表

做了这么多年财务数据分析&#xff0c;我发现国内很多公司的财务BP&#xff0c;还停留在自己造表的阶段。每人一套表&#xff0c;格式五花八门&#xff0c;数据口径对不上。结果就是BP花大量时间在拉表、对数的琐事上&#xff0c;真正花在业务分析和决策支持上的时间少之又少。…...

终极指南:如何让2012-2015年老款Mac安装最新macOS系统

终极指南&#xff1a;如何让2012-2015年老款Mac安装最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 您的2012-2015年老款Mac是否已被苹果官方抛…...

防爆气象站为什么能够成为化工行业的必备仪器

防爆气象站能够成为化工行业的必备仪器&#xff0c;主要基于其本质安全设计、多参数精准监测、实时预警能力、环境适应性、合规管理支持及生产优化价值六大核心优势&#xff0c;这些特性直接解决了化工行业在安全管控、工艺控制及合规运营中的关键痛点。一、本质安全设计&#…...

3个高效功能让视频创作者轻松生成专业字幕

3个高效功能让视频创作者轻松生成专业字幕 【免费下载链接】video-srt-windows 这是一个可以识别视频语音自动生成字幕SRT文件的开源 Windows-GUI 软件工具。 项目地址: https://gitcode.com/gh_mirrors/vi/video-srt-windows 工具概述 VideoSrt是一款基于Golang开发的…...

实战分享:如何用本地替换和插桩调试搞定Kasada最新版x-kpsdk-cd环境检测

逆向工程实战&#xff1a;Kasada最新版x-kpsdk-cd环境检测的深度调试策略 在当今Web安全防护体系中&#xff0c;Kasada作为新一代反自动化攻击解决方案&#xff0c;其x-kpsdk-cd机制通过动态加密和运行时环境检测构建了强大的防御层。面对从280位扩展到294位的加密数组和Proxy保…...

Kivy中文显示乱码?3步搞定字体配置(附免费字体下载)

Kivy中文显示乱码&#xff1f;3步搞定字体配置&#xff08;附免费字体下载&#xff09; 当你在Kivy应用中看到中文变成一堆问号或方框时&#xff0c;别急着怀疑人生——这通常是字体配置的小问题。作为Python生态中最受欢迎的跨平台GUI框架之一&#xff0c;Kivy默认使用Roboto字…...

计算机毕业设计springboot智慧化教学辅助系统 基于SpringBoot的智能化教学管理与评价平台 SpringBoot驱动的数字化教学支持服务平台

计算机毕业设计springboot智慧化教学辅助系统 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着信息技术的迅猛发展和全球教育环境的不断变化&#xff0c;传统教育模式正面临着…...

OpCore-Simplify:开源系统硬件适配自动化的技术突破

OpCore-Simplify&#xff1a;开源系统硬件适配自动化的技术突破 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在开源系统定制领域&#xff0c;硬件兼…...

告别低效:用快马ai一键生成can总线数据分析与统计脚本

在汽车电子和嵌入式系统开发中&#xff0c;CAN总线数据的分析是个高频需求。无论是调试车载网络问题&#xff0c;还是优化通信性能&#xff0c;都离不开对海量CAN帧数据的处理。但手动写解析脚本不仅耗时&#xff0c;还容易遗漏关键细节。最近我发现用InsCode(快马)平台的AI辅助…...