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

【设计模式】之适配器模式

系列文章目录

(其他设计模式可以到 👉👉👉)设计模式_小杰不秃头的博客  😊😄😛


前言

今天继续给大家介绍23种设计模式中的适配器模式,这个模式相比于其他模式比较好理解,我们一起来学习一下吧。🌈


一、什么是适配器模式

适配器模式(Adapter Pattern):适配器模式是一种结构型设计模式,它允许一个类的接口与另一个类的接口不兼容时,创建一个中间的类来适配这些不兼容的接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

二、有哪些应用场景呢

应用场景

  • 旧代码与新代码之间的适配:当新代码需要调用旧代码,但两者接口不兼容时。
  • 多个类具有相似的功能,但接口不兼容:为了统一接口,可以使用适配器模式。
  • 使用第三方库:当使用的第三方库提供的接口与自己的代码不兼容时。
  • 功能增强或扩展:当需要为某个类添加额外的功能,而这些功能在原始类中并不存在时,可以使用适配器模式来创建一个新的适配器类

三、实战案例

我就举一个简单的例子,假设我们有一个老式的OldMediaPlayer类,它只能播放mp3文件,但我们希望它也能播放wav文件。为此,我们可以创建一个AudioAdapter类,它实现了MediaPlayer接口(这是我们想要的新接口),并在内部使用OldMediaPlayer类来播放mp3文件,同时对于wav文件,我们可以使用其他逻辑(比如转换成mp3或直接使用其他播放器)。

创建OldMediaPlayer类:

// 适配者类(现有的类,需要被适配)
public class OldMediaPlayer {public void playMp3(String filename){System.out.println("Playing Mp3 File:" + filename);}
}

 接着创建MediaPlayer接口:

interface MediaPlayer {void play(String audioType, String fileName);
}

最后创建AudioAdapter类:

//适配器类,在原有OldMediaPlayer 的功能上添加新的功能
public class AudioAdapter implements MediaPlayer{private OldMediaPlayer oldMediaPlayer;public AudioAdapter() {//AudioAdapter创建时实例化OldMediaPlayerthis.oldMediaPlayer = new OldMediaPlayer();}@Overridepublic void play(String audioType, String fileName) {if ("mp3".equalsIgnoreCase(audioType)){oldMediaPlayer.playMp3(fileName);}else if ("wav".equalsIgnoreCase(audioType)){//拓展新的播放类型System.out.println("Playing Wav file: " + fileName );}}
}

测试

void test1(){AudioAdapter audioAdapter = new AudioAdapter();audioAdapter.play("mp3","小苹果.mp3");audioAdapter.play("wav","小苹果.wav");}/*测试结果:Playing Mp3 File:小苹果.mp3Playing Wav file: 小苹果.wav
*/

总结

相比到这里大家对适配器模式有了一定的了解,那么我们来总结一下它的优缺点

优点

  • 灵活性:通过适配器,可以轻松地集成来自不同源的类,而无需修改它们的源代码。
  • 可复用性:适配器可以被多个不兼容的类复用。
  • 解耦:适配器将目标接口和适配者类解耦,使得它们可以独立地变化。

缺点

  • 增加系统的复杂性:引入适配器可能会使系统更加复杂。
  • 代码可能变得难以维护:如果适配器过多,或者适配器逻辑复杂,可能会增加维护的难度。

它的优点很明显,但是任何设计模式都有优缺点,虽然它能够帮助我们适配新旧功能,但是过多使用适配器反而适得其反,所以,大家在使用设计模式的时候一定要再三考虑。

相关文章:

【设计模式】之适配器模式

系列文章目录 (其他设计模式可以到 👉👉👉)设计模式_小杰不秃头的博客 😊😄😛 前言 今天继续给大家介绍23种设计模式中的适配器模式,这个模式相比于其他模式比较好理解…...

Python轻量级Web框架Flask(13)—— Flask个人博客项目

0、前言: ★这部分内容是基于之前Flask学习内容的一个实战项目梳理内容,没有可以直接抄下来跑的代码,是学习了之前Flask基础知识之后,再来看这部分内容,就会对Flask项目开发流程有更清楚的认知,对一些开发细节可以进一步的学习。项目功能,通过Flask制作个人博客。项目架…...

电商技术揭秘营销相关系列文章合集(4)

相关系列文章 电商技术揭秘相关系列文章合集(1) 电商技术揭秘相关系列文章合集(2) 电商技术揭秘相关系列文章合集(3) 文章目录 引言集合说明集合文章列表 引言 在数字化浪潮的推动下,电商行…...

LeetCode-2391. 收集垃圾的最少总时间【数组 字符串 前缀和】

LeetCode-2391. 收集垃圾的最少总时间【数组 字符串 前缀和】 题目描述:解题思路一:处理垃圾和路程单独计算。解题思路二:逆向思维,计算多走的路解题思路三:只记录,当前t需要计算几次 题目描述:…...

再有人说数字孪生大屏没有用,用这8条怼回去。

数字孪生大屏之所以受到欢迎,主要有以下几个原因: 实时数据可视化 数字孪生大屏可以将实时数据以直观的可视化形式展示出来,让用户能够一目了然地了解数据的状态和趋势。这样可以帮助用户更好地理解和分析数据,及时做出决策和调…...

蓝桥杯练习系统(算法训练)ALGO-946 Q神的足球赛

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 足球赛上,只见Q神如闪电般的速度带球时而左,时而右,时而前,时而后&#xff…...

【Android】Kotlin学习之Kotlin方法的声明和传参

方法声明 普通类的方法 静态类的方法 不需要构建实例对象, 可以通过类名直接访问静态方法 : NumUtil.double(1) companion object 伴生类的方法 使用companion object 在普通类里定义静态方法 参数 括号内传入方法 : 当参数是方法时, 并且是最后一个参数 , 可以使用括号外…...

微信小程序 17:小程序使用 npm 包和组件应用

目前,小程序中已经支持实用 npm 安装第三方包,从而提高小程序的开发效率,但是在小程序中使用 npm 包有三个限制: 不支持 Node.js内置库的包不支持依赖于浏览器内置对象的包不支持依赖于 C插件的包 Vant Weapp Vant Weapp是有赞…...

【mysql篇】执行delete删除大量数据后,磁盘未清空,为什么?

目录 迁移脚本删除数据以及备份数据 解决方法OPTIMIZE TABLE二进制日志按月生成数据 最近某个项目虽说用户量不大,但是,单表的数据量越来越大,mysql一般单表超过千万级别后,性能直线下降,所以利用shardingphere按月做了…...

【Qt 学习笔记】Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍 文章编号&#x…...

在Mars3d实现cesium的ImageryLayer自定义瓦片的层级与原点

需要自定义瓦片层级和原点,所以需要自己写第三方图层,但是之前写的很多方法,图层控制和显隐以及透明度,需要跟之前的交互一直,改动量太大的话不划算,所以直接看Mars3d的layer基类,把重写的image…...

logback日志持久化

1、问题描述 使用logback持久化记录日志。 2、我的代码 logback是Springboot框架里自带的&#xff0c;所以只要引入“spring-boot-starter”就行了。无需额外引入logback依赖。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns&…...

函数原型(Function Prototype)、函数定义(Function Definition)和函数声明(Function Declaration)

函数原型&#xff08;Function Prototype&#xff09;、函数定义&#xff08;Function Definition&#xff09;和函数声明&#xff08;Function Declaration&#xff09;在C和C等编程语言中扮演着不同的角色&#xff0c;但它们有时在概念上可能会有些重叠。下面是它们之间的主要…...

Go有无缓冲channel的区别

无缓冲的channel channel的默认类型就是无缓冲的。当一个数据被发送到无缓冲的channel中&#xff0c;发送操作会被阻塞&#xff0c;知道有另一个goroutine从这个channel中接收这个数据。同样&#xff0c;当试图从一个无缓冲的channel中接收数据时&#xff0c;如果没有数据可以…...

【全开源】Fastflow工作流系统(源码搭建/上线/运营/售后/维护更新)

一款基于FastAdminThinkPHP开发的可视化工作流程审批插件&#xff0c;帮助用户基于企业业务模式和管理模式自行定义所需的各种流程应用&#xff0c;快速构建企业自身的流程管控体系&#xff0c;快速融合至企业协同OA办公系统。 提供全部无加密服务端源码和前端源代码&#xff0…...

超越传统游戏:生成式人工智能对游戏的变革性影响

人工智能&#xff08;AI&#xff09;在游戏中的应用 游戏产业是一个充满活力、不断发展的领域&#xff0c;人工智能&#xff08;AI&#xff09;的融入对其产生了重大影响。这一技术进步彻底改变了游戏的开发、玩法和体验方式。本文分析的重点是传统人工智能和生成式人工智能在游…...

SpringCloud微服务之Eureka、Ribbon、Nacos详解

SpringCloud微服务之Eureka、Ribbon、Nacos详解 1、认识微服务1.1、单体架构1.2、分布式架构1.3、微服务1.4、SpringCloud 2、服务拆分与远程调用2.1、服务拆分的原则2.2、服务拆分示例2.2、提供者与消费者 3、Eureka注册中心3.1、Eureka的结构和作用3.2、搭建eureka-server3.2…...

五角钱的程序员 | Kafka 是什么?

本文来源公众号“五角钱的程序员”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Kafka 是什么&#xff1f; 你是一个程序员&#xff0c;假设你维护了两个服务 A 和 B。B 服务每秒只能处理 100 个消息&#xff0c;但 A 服务却每秒…...

C++中合成的默认构造函数的访问权限

问题 我们知道&#xff0c;在C中&#xff0c;如果没有为一个类显式定义构造函数&#xff0c;那么编译器会为我们隐式地定义一个默认构造函数。那么&#xff0c;你有没有想过&#xff0c;这个隐式定义的默认构造函数&#xff08;合成的默认构造函数&#xff09;的访问权限是什么…...

【前端】桌面版docker并部署前端项目

环境 win10专业版 2004 , 需科学 官网下载安装包并安装4.29.0版本 终端输入 wsl --installdocker桌面版和模拟器只能选一个&#xff0c;不然一直转圈圈 镜像配置加速&#xff0c;在settings—>docker engine下 {"builder": {"gc": {"defaultKee…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...