【设计模式】之适配器模式
系列文章目录
(其他设计模式可以到 👉👉👉)设计模式_小杰不秃头的博客 😊😄😛
前言
今天继续给大家介绍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神如闪电般的速度带球时而左,时而右,时而前,时而后ÿ…...
【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框架里自带的,所以只要引入“spring-boot-starter”就行了。无需额外引入logback依赖。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns&…...
函数原型(Function Prototype)、函数定义(Function Definition)和函数声明(Function Declaration)
函数原型(Function Prototype)、函数定义(Function Definition)和函数声明(Function Declaration)在C和C等编程语言中扮演着不同的角色,但它们有时在概念上可能会有些重叠。下面是它们之间的主要…...
Go有无缓冲channel的区别
无缓冲的channel channel的默认类型就是无缓冲的。当一个数据被发送到无缓冲的channel中,发送操作会被阻塞,知道有另一个goroutine从这个channel中接收这个数据。同样,当试图从一个无缓冲的channel中接收数据时,如果没有数据可以…...
【全开源】Fastflow工作流系统(源码搭建/上线/运营/售后/维护更新)
一款基于FastAdminThinkPHP开发的可视化工作流程审批插件,帮助用户基于企业业务模式和管理模式自行定义所需的各种流程应用,快速构建企业自身的流程管控体系,快速融合至企业协同OA办公系统。 提供全部无加密服务端源码和前端源代码࿰…...
超越传统游戏:生成式人工智能对游戏的变革性影响
人工智能(AI)在游戏中的应用 游戏产业是一个充满活力、不断发展的领域,人工智能(AI)的融入对其产生了重大影响。这一技术进步彻底改变了游戏的开发、玩法和体验方式。本文分析的重点是传统人工智能和生成式人工智能在游…...
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 是什么?
本文来源公众号“五角钱的程序员”,仅用于学术分享,侵权删,干货满满。 原文链接:Kafka 是什么? 你是一个程序员,假设你维护了两个服务 A 和 B。B 服务每秒只能处理 100 个消息,但 A 服务却每秒…...
C++中合成的默认构造函数的访问权限
问题 我们知道,在C中,如果没有为一个类显式定义构造函数,那么编译器会为我们隐式地定义一个默认构造函数。那么,你有没有想过,这个隐式定义的默认构造函数(合成的默认构造函数)的访问权限是什么…...
【前端】桌面版docker并部署前端项目
环境 win10专业版 2004 , 需科学 官网下载安装包并安装4.29.0版本 终端输入 wsl --installdocker桌面版和模拟器只能选一个,不然一直转圈圈 镜像配置加速,在settings—>docker engine下 {"builder": {"gc": {"defaultKee…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
