【Java设计模式】四、适配器模式
文章目录
- 1、适配器模式
- 2、举例
1、适配器模式
- 适配器模式Adapter Pattern,是做为两个不兼容的接口之间的桥梁
- 目的是将一个类的接口转换成客户希望的另外一个接口
- 适配器模式可以使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
最后,适配器是对已经开发完的系统的一种改造思路,新设计尽量一次设计好,或者时间充裕就重构。适配器太多会使得系统很乱,看着在调A接口,底下已被适配到了B接口。
2、举例
背景:有两个接口,分别为媒体播放器(播放音频)、高级媒体播放器(播放视频)。创建适配器,将二者的功能融合。两个接口:
/*** 高级媒体播放器* 可播放视频*/
public interface AdvanceMediaPlayer {public void playVlc(String fileName);public void playMp4(String fileName);
}
/*** 媒体播放器接口* 可播放音频*/
public interface MediaPlayer {public void play(String audioType, String fileName);
}
写高级媒体播放器的实现类:
public class Mp4Player implements AdvanceMediaPlayer{@Overridepublic void playVlc(String fileName) {当前格式为mp4格式,对vlc的播放不做具体实现}@Overridepublic void playMp4(String fileName) {System.out.println("播放Mp4文件:" + fileName);}
}
public class VlcPlayer implements AdvanceMediaPlayer{@Overridepublic void playVlc(String fileName) {System.out.println("播放vlc文件:" + fileName);}@Overridepublic void playMp4(String fileName) {//当前格式为vlc格式,对mp4的播放不做具体实现}
}
创建适配器,注入待合并的那个接口的对象。自定义有参构造方法,并对待合并接口对象完成初始化赋值:
public class MediaPlayerAdapter implements MediaPlayer {private AdvanceMediaPlayer advanceMediaPlayer;/*** 定义个有参的构造方法,形参为自定义的String类型* @param audioType 媒体文件类型*/public MediaPlayerAdapter(String audioType) {if ("vlc".equalsIgnoreCase(audioType)) {advanceMediaPlayer = new VlcPlayer();} else if ("mp4".equalsIgnoreCase(audioType)) {advanceMediaPlayer = new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {//判断当前媒体的格式是mp4还是vlcif ("vlc".equalsIgnoreCase(audioType)) {//播放vlc文件advanceMediaPlayer.playVlc(fileName);} else if ("mp4".equalsIgnoreCase(audioType)) {//播放mp4文件advanceMediaPlayer.playMp4(fileName);}}
}
到此,适配器拥有了待合并接口所有实现类的功能。写另一个接口媒体播放器的实现类,里面注入适配器对象,如果是音频,则实现类正常完成,如果是视频,则通过适配器完成:
public class AudioPlayer implements MediaPlayer {private MediaPlayerAdapter adapter;@Overridepublic void play(String audioType, String fileName) {//音频文件,比如mp3if ("mp3".equalsIgnoreCase(audioType)) {System.out.println("播放mp3文件:" + fileName);} else if ("vlc".equalsIgnoreCase(audioType) || "mp4".equalsIgnoreCase(audioType)) {//视频文件(高级媒体文件)adapter = new MediaPlayerAdapter(audioType);adapter.play(audioType, fileName); //到此,完成了两个接口的适配,不管是音频还是视频,我这儿都能播放}}
}
到此,完成合并,测试类:
public class Test {public static void main(String[] args) {AudioPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "啦啦啦.mp3");audioPlayer.play("vlc", "喜羊羊.vlc");audioPlayer.play("mp4", "视频.mp4");}
}

相关文章:
【Java设计模式】四、适配器模式
文章目录 1、适配器模式2、举例 1、适配器模式 适配器模式Adapter Pattern,是做为两个不兼容的接口之间的桥梁目的是将一个类的接口转换成客户希望的另外一个接口适配器模式可以使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 最后,适配器…...
RV32/64 特权架构 - 特权模式与指令
RV32/64 特权架构 - 特权模式与指令 1 特权模式2 特权指令2.1 mret(从机器模式返回到先前的模式)2.2 sret(从监管模式返回到先前的模式)2.3 wfi(等待中断)2.4 sfence.vma(内存屏障) …...
多微服务合并为一个服务
公司微服务细分太多,最近跟我提说需要将几个微服务合为单体,经过几天的查阅,决定用二次打包的方式进行合并,然后部署的时候在nginx改下合并的微服务转发路劲即可,不需要前端修改路劲了。 方案 采用二次打包的方式进行…...
Springboot企业级开发--开发入门01
目录 目录 一.Spring Boot的主要特点和优势包括: 二.Spring Boot的核心功能可以归纳为以下几点: 三.Springboot是如何解决问题? Spring Boot 是一个开源的Java框架,其设计目标是为了简化新Spring应用的初始搭建以及开发过程。…...
bash和sh和./的区别
bash和sh和./的区别 今天在执行一个脚本的时候,用的是sh script.sh,执行报错,使用bash script.sh执行时就能成功,才知道sh和bash是不一样的 sh sh表示 Bourne Shell,是 Unix 系统上的一种基本的命令解释器。它也可以…...
LeetCode 3:寻找最长不含重复字符的子串长度
LeetCode 3:寻找最长不含重复字符的子串长度 在字符串处理中,寻找最长不含重复字符的子串长度是一个经典问题。 问题描述 给定一个字符串 s ,我们需要找出其中不含有重复字符的最长子串的长度。 解决方案 我们可以使用滑动窗口的方法来解…...
【自然语言处理四-从矩阵操作角度看 自注意self attention】
自然语言处理四-从矩阵操作角度看 自注意self attention 从矩阵角度看self attention获取Q K V矩阵注意力分数softmax注意力的输出再来分析整体的attention的矩阵操作过程从矩阵操作角度看,self attention如何解决问题的?W^q^ W^k^ W^v^这三个矩阵怎么获…...
Unity脚本,串行端口的握手协议(流控制)
在Unity的SerialPort构造函数中,流控制并没有被直接包含。流控制,也被称为握手,是一种过程,它管理数据的传输速度,以防止接收方被发送方发送的数据量所淹没。 在.NET的SerialPort类中,流控制是通过Handshak…...
2023 re:Invent 用 Amazon Q 打造你的知识库
前言 随着 ChatGPT 的问世,我们迎来了许多创新和变革的机会。一年一度的亚马逊云科技大会 re:Invent 也带来了许多前言的技术,其中 Amazon CEO Adam Selipsky 在 2023 re:Invent 大会中介绍 Amazon Q 让我印象深刻,这预示着生成式 AI 的又一…...
ChatGPT 国内快速上手指南
ChatGPT简介 ChatGPT是由OpenAI团队研发的自然语言处理模型,该模型在大量的互联网文本数据上进行了预训练,使其具备了深刻的语言理解和生成能力。 GPT拥有上亿个参数,这使得ChatGPT在处理各种语言任务时表现卓越。它的训练使得模型能够理解上…...
Docker 常用操作命令备忘
Docker 一旦设置好了环境,日常就只要使用简单命令就可以运行和停止。 于是,我每次用的时候,都想不起来一些关键性的命令到底怎么用,特此记录。 一、镜像管理 从公有仓库拉取镜像 (对于使用苹果电脑 M1/M2/M3 芯片的 …...
BUU [CISCN2019 华东南赛区]Web4
BUU [CISCN2019 华东南赛区]Web4 题目描述:Click to launch instance. 开题: 点击链接,有点像SSRF 使用local_file://协议读到本地文件,无法使用file://协议读取,有过滤。 local_file://协议: local_file…...
【卷积神经网络中用1*1 卷积有什么作用或者好处呢?】
🚀 作者 :“码上有前” 🚀 文章简介 :深度学习 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 1*1 卷积有什么作用或者好处呢 作用降维和增加非线性特征组合和交互网络的宽度和深度调整全连接替代增强…...
分布式系统概念及其应用
分布式系统概念及其应用 随着互联网的飞速发展,数据量和计算需求不断增加,传统的集中式系统已经无法满足这些需求。因此,分布式系统应运而生,它通过将计算任务分散到多台计算机上,实现高效的计算和存储。本文将介绍分…...
数据报文转换
报文转换 🍓JSON🍒🍒JSON多字段映射成一个实体对象🍒🍒JSON反序列化为一个带有泛型的JAVA类型 🍓xml 🍓JSON 🍒🍒JSON多字段映射成一个实体对象 <dependency><…...
Python爬虫-付费代理推荐和使用
付费代理的使用 相对免费代理来说,付费代理的稳定性更高。本节将介绍爬虫付费代理的相关使用过程。 1. 付费代理分类 付费代理分为两类: 一类提供接口获取海量代理,按天或者按量收费,如讯代理。 一类搭建了代理隧道࿰…...
kubectl使用及源码阅读
目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…...
C++面试宝典第32题:零钱兑换
题目 给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,则返回-1。说明:你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = …...
pyspark分布式部署随机森林算法
前言 分布式算法的文章我早就想写了,但是一直比较忙,没有写,最近一个项目又用到了,就记录一下运用Spark部署机器学习分类算法-随机森林的记录过程,写了一个demo。 基于pyspark的随机森林算法预测客户 本次实验采用的…...
【Python笔记-设计模式】中介者模式
一、说明 中介者模式是一种行为设计模式,减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信,将复杂的交互转化为通过中介者进行的间接交…...
华为OD机试真题 新系统 2026-04-19 JavaGo 实现【8位LED控制器】
目录 题目 思路 Code 题目 有一个8位LED控制器,包含8个LED灯(编号0-7),初始状态全灭,用8位二进制表示为:00000000。控制器可以接收以下三种指令: Lx:L表示点亮操作,x表示LED的编号(0一7),操作得到的结果是:点亮第x个LED灯,把状态设为1。 Dx:D表示熄灭操作,x表示LED的…...
MySQL存储过程如何实现循环打印日志_调试信息输出技巧
MySQL存储过程调试首选建临时日志表INSERT记录,或用SELECT CONCAT输出(仅开发环境手动调用有效);禁用SIGNAL抛异常打日志,因其中断执行且低版本不支持;循环内应批量拼接日志再插入以提升性能。MySQL存储过程…...
别再死记硬背了!用Multisim仿真带你直观理解三极管的三种放大电路
用Multisim仿真破解三极管放大电路的奥秘:从波形观测到参数调优 虚拟实验室:当仿真工具遇上经典放大电路 第一次接触三极管放大电路时,那些密密麻麻的公式和抽象的特性曲线总让人望而生畏。共射、共集、共基三种组态的区别,输入输…...
隐私数据不外传:用FireRedASR-AED-L实现完全本地的语音转文字
隐私数据不外传:用FireRedASR-AED-L实现完全本地的语音转文字 1. 为什么需要本地语音识别 在当今数据安全日益重要的环境下,将敏感语音数据上传到云端处理存在诸多风险。医疗咨询、商业会议、法律取证等场景中的语音内容往往包含高度敏感信息ÿ…...
如何用XUnity.AutoTranslator实现Unity游戏多语言自动翻译:终极实战指南
如何用XUnity.AutoTranslator实现Unity游戏多语言自动翻译:终极实战指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为游戏出海而烦恼语言本地化问题吗?XUnity.AutoTransl…...
NCMconverter:3分钟快速解锁加密音乐文件的终极免费方案
NCMconverter:3分钟快速解锁加密音乐文件的终极免费方案 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter 你是否曾经遇到过这样的情况:从音乐平台下载了心…...
产品经理面试:Axure原型11-20题及答案(一般不会超纲)
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure原型设计精品课https://edu.csdn.net/course/detail/40420 产品需求分析训练https://edu.csdn.net/course/detail/40465 目录 第十一题&am…...
【AI模型】概念-评测基准
【AI&游戏】专栏-直达 AI模型评测基准 AI模型评测基准(Benchmarks)是一系列标准化测试任务,用于评估大语言模型在不同方面的能力表现。了解模型评测基准有助于选择合适的模型,评估模型性能,并指导模型优化方向。 …...
冰雪传奇三职业深度解析!官方认证下支持安卓、iOS、PC 三端互通
风华经典手游平台是国内知名游戏门户网站官网经典IP端游授权开发1:1复刻手游,用户可通过风华经典手游官网获取游戏及资讯礼包码,官网设置专属游戏客服提供游戏服务!本次为各位新手玩家带来《冰雪传奇三职业》提起传奇,…...
采购申请创建后如何修改?SAP ABAP中BAPI_PR_CHANGE的实用指南与常见问题
SAP ABAP采购申请修改实战:BAPI_PR_CHANGE深度解析与避坑指南 在SAP MM模块的日常运维中,采购申请的修改操作远比创建更考验开发者的技术功底。当业务部门频繁提出"能否追加行项目"、"预算科目填错了"、"交货日期需要提前"…...
