设计模式(七):适配器模式

embedded/2024/9/23 9:22:58/

设计模式(七):适配器模式

1. 适配器模式的介绍

适配器模式(Adapter Pattern)属于结构型模式,是作为两个不兼容的接口之间的桥梁。这种类型的设计模式它结合了两个独立接口的功能。

主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。适配器继承或依赖已有的对象,实现想要的目标接口。

2. 适配器模式的类图

一个MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayerAudioPlayer 只可以播放 mp3 格式的音频文件。

另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。它们可以播放 wavalac 格式的音频文件。

如果想要让 AudioPlayer 播放wavalac 格式的音频文件,需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。

AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。

在这里插入图片描述

3. 适配器模式的实现

3.1 创建媒体播放器和高级媒体播放器接口

java">package blog;/*** 媒体播放器*/
public interface MediaPlayer {void play(String type, String file);
}
java">package blog;/*** 高级媒体播放器*/
public interface AdvancedMediaPlayer {void playWav(String file);void playAlac(String file);
}

3.2 创建具体播放器

java">package blog;/*** 音频播放器*/
public class AudioPlayer implements MediaPlayer{private MediaAdapter mediaAdapter;@Overridepublic void play(String type, String file) {if ("mp3".equals(type)) {System.out.println("播放mp3格式的音频文件:" + file);return;}if ("wav".equals(type) || "alac".equals(type)) {mediaAdapter = new MediaAdapter(type);mediaAdapter.play(type, file);return;}System.out.println("播放器不支持"+ type +"格式的文件");}
}
java">package blog;/*** wav格式播放器*/
public class WavPlayer implements AdvancedMediaPlayer{@Overridepublic void playWav(String file) {System.out.println("播放wav格式的音频文件:" + file);}@Overridepublic void playAlac(String file) {}
}
java">package blog;/*** alac格式播放器*/
public class AlacPlayer implements AdvancedMediaPlayer{@Overridepublic void playWav(String file) {}@Overridepublic void playAlac(String file) {System.out.println("播放alac格式的音频文件:" + file);}
}

3.3 创建媒体适配器

java">package blog;/*** 媒体适配器*/
public class MediaAdapter implements MediaPlayer{private AdvancedMediaPlayer advancedMediaPlayer;public MediaAdapter(String type) {if ("wav".equals(type)) {advancedMediaPlayer = new WavPlayer();}if ("alac".equals(type)) {advancedMediaPlayer = new AlacPlayer();}}@Overridepublic void play(String type, String file) {if ("wav".equals(type)) {advancedMediaPlayer.playWav(file);}if ("alac".equals(type)) {advancedMediaPlayer.playAlac(file);}}
}

3.4 测试

java">package blog;public class AdapterDemo {public static void main(String[] args) {AudioPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "阳光男孩");audioPlayer.play("wav", "你的背包");audioPlayer.play("alac", "一千年以后");audioPlayer.play("ape", "后会无期");}
}

http://www.ppmy.cn/embedded/23882.html

相关文章

c#数据库:1.c#创建并连接数据库

安装软件:SQL Server Management Studio Management Studio Visual Studio 2022 启动服务: 打开SQL Server Management Studio Management Studio ,连接到服务器(GUANZU是我的计算机名) 新建数据库,随便起个名字叫aq: c#代码: using System; using System.Collections.Gener…

关于Android优化

Android优化是一个复杂且多方面的过程,涉及到应用程序的各个方面,包括性能、用户体验、安全性等。以下是对Android优化的详细阐述,包括优化策略、优化方法以及优化工具,并辅以具体的案例或示例。 优化策略 一、用户体验优化 用…

【Spring AI】02. 嵌入向量API-OpenAI

文章目录 OpenAI Embeddings先决条件添加仓库和 BOM 自动装配嵌入向量属性重试属性连接属性配置属性 Embedding Options示例接口(自动配置) 手动配置 OpenAI Embeddings Spring AI 支持 OpenAI 的文本嵌入模型。OpenAI 的文本嵌入模型用于衡量文本字符串…

已解决java.util.prefs.InvalidPreferencesFormatException异常的正确解决方法,亲测有效!!!

已解决java.util.prefs.InvalidPreferencesFormatException异常的正确解决方法,亲测有效!!! 目录 问题分析 报错原因 解决思路 解决方法 第一步:验证XML文件结构 第二步:检查文件编码 第三步&#…

Qt Creator Pro文件添加库和源文件

在项目的pro文件所在的文件夹中添加源文件lib_header ,entityobject 如下图所示: 在 pro 文件里面添加源文件的路径如下所示: 这个英文符号点,表示当前目录,因为这个文件是和pro文件在同一个目录下,所以用…

使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B

2024年4月18日,meta开源了Llama 3大模型[1],虽然只有8B[2]和70B[3]两个版本,但Llama 3表现出来的强大能力还是让AI大模型界为之震撼了一番,本人亲测Llama3-70B版本的推理能力十分接近于OpenAI的GPT-4[4],何况还有一个4…

Python爬虫--Scrapy框架安装

Scrapy框架安装 , Scrapy 是 Python 领域专业的爬虫开发框架,已经完成爬虫程序的大部分通用工具 它使用了 Twisted 异步网络库来处理网络通讯。整体架构大致如下 第一步:挂小灰机或者将要安装的文件下载到本地 Scrapy 框架安装踩坑中 为什…

java基础郎波版chapter4习题

文章目录 1.试说明Java语言是如何支持多重继承的。2.类的构造方法和成员方法之间有什么区别?构造方法:成员方法: 3.编写程序片段,定义表示课程的类Course。4,编写程序创建习题3中的Course类的对象,设置并打印输出该对象的课程名、编号以及先…