适配器模式(Adapter Pattern)

ops/2025/1/16 0:54:05/

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类一起工作。适配器模式通过将类的接口转换为客户期望的另一个接口,使原本接口不兼容的类可以合作。

以下是一个简单的Java代码示例,演示如何使用适配器模式:

场景说明

假设你有一个MediaPlayer接口,它可以播放音频文件。现在,你有一个更复杂的AdvancedMediaPlayer接口,它可以播放音频和视频文件。你想让MediaPlayer能够使用AdvancedMediaPlayer来播放不同格式的文件,但不改变MediaPlayer的接口。

代码实现

java">// 定义MediaPlayer接口
interface MediaPlayer {void play(String audioType, String fileName);
}// 定义AdvancedMediaPlayer接口
interface AdvancedMediaPlayer {void playVlc(String fileName);void playMp4(String fileName);
}// 实现AdvancedMediaPlayer接口的具体类
class VlcPlayer implements AdvancedMediaPlayer {public void playVlc(String fileName) {System.out.println("Playing vlc file. Name: " + fileName);}public void playMp4(String fileName) {// 什么也不做}
}class Mp4Player implements AdvancedMediaPlayer {public void playVlc(String fileName) {// 什么也不做}public void playMp4(String fileName) {System.out.println("Playing mp4 file. Name: " + fileName);}
}// 创建适配器类,实现MediaPlayer接口,并使用AdvancedMediaPlayer对象
class MediaAdapter implements MediaPlayer {AdvancedMediaPlayer advancedMusicPlayer;public MediaAdapter(String audioType) {if (audioType.equalsIgnoreCase("vlc")) {advancedMusicPlayer = new VlcPlayer();} else if (audioType.equalsIgnoreCase("mp4")) {advancedMusicPlayer = new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("vlc")) {advancedMusicPlayer.playVlc(fileName);} else if (audioType.equalsIgnoreCase("mp4")) {advancedMusicPlayer.playMp4(fileName);}}
}// 实现MediaPlayer接口的具体类
class AudioPlayer implements MediaPlayer {MediaAdapter mediaAdapter;@Overridepublic void play(String audioType, String fileName) {// 支持MP3播放if (audioType.equalsIgnoreCase("mp3")) {System.out.println("Playing mp3 file. Name: " + fileName);}// 使用适配器播放vlc和mp4文件else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {mediaAdapter = new MediaAdapter(audioType);mediaAdapter.play(audioType, fileName);}else {System.out.println("Invalid media. " + audioType + " format not supported");}}
}// 测试代码
public class AdapterPatternDemo {public static void main(String[] args) {AudioPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "beyond the horizon.mp3");audioPlayer.play("mp4", "alone.mp4");audioPlayer.play("vlc", "far far away.vlc");audioPlayer.play("avi", "mind me.avi");}
}

输出结果

Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media. avi format not supported

代码解释

  • MediaPlayer接口定义了播放媒体文件的方法play()
  • AdvancedMediaPlayer接口定义了播放特定格式文件的方法playVlc()playMp4()
  • VlcPlayerMp4PlayerAdvancedMediaPlayer的具体实现类。
  • MediaAdapter类是适配器,它实现了MediaPlayer接口,并将请求委托给合适的AdvancedMediaPlayer对象。
  • AudioPlayer类是客户端,它可以使用MediaAdapter来播放不同格式的文件。

这个例子展示了如何使用适配器模式来让不同接口的类可以协同工作,而无需修改它们的源代码。


http://www.ppmy.cn/ops/105415.html

相关文章

初尝内核中断

每台计算机都连接有很多外设,那操作系统对这些外设进行管理时要如何通信呢?一般有轮询(Polling)和中断(Interrupt)两种,第一种是操作系统定时主动去查询这些外设,看有没有设备需要进行处理,而第二种则是外设需要处理时主动向操作系统发送请求信号,然后操作系统再做相…

Unity实战案例 2D小游戏HappyGlass(模拟水珠)

本案例素材和教程都来自Siki学院,十分感谢教程中的老师 本文仅作学习笔记分享交流,不作任何商业用途 预制体 在这个小案例中,水可以做成圆形但是带碰撞体,碰撞体比图形小一圈,顺便加上Trail renderer组件 材质 将碰撞…

ts类型体操笔记

ts类型体操笔记 一、infer关键字 1. infer 作用 用于推导泛型参数,并且infer的声明只能出现在extend子语句中 2. infer 用法 infer后面加变量名 例如:获取 Promise 返回的参数 interface User {name: stringage: number }type PromiseType Promi…

字节跳动一面

字节跳动一面【C后端开发】 base : 深圳 岗位:C后端开发 时间: 2024/8/30 文章目录 基本介绍C语言1. 堆栈内存是否连续,为什么?2. int i0; i ; 两个线程同时执行10000次,i最终的数值是多少?3.…

GD32F103单片机-概述和工程建立

GD32F103单片机-概述和工程建立 一、GD32F103单片机介绍1.1 GD32F103C8T6引脚1.2 GD32F103C8T6系统架构和启动配置1.3 GD32F103C8T6时钟树 二、GD32F103工程建立 一、GD32F103单片机介绍 GD32F103系列由是由国内公司兆易创新生产的基于Arm Cortex-M3处理器的单片机位数&#x…

英特尔 Arrow Lake Halo 再现,猛堆料对标Strix Halo/苹果M系列

原文转载修改自: Arrow Lake Halo暴力堆料,对标Strix Halo,M系列 根据最近的消息,蓝厂准备于来年1月推出笔记本Arrow Lake-H处理器。虽然在传闻中Arrow Lake-H又是Arc Alchemist架构革新,又是6P8E,但基于…

【方法】如何防止他人看到压缩包内部的文件列表?

在使用压缩工具时,保护文件内容的安全性非常重要。有时,仅仅加密文件内容还不够,还需要隐藏压缩包中的文件名,防止他人看到压缩包内部的文件列表。下面小编分享两种简单有效的方法,一起来看看吧! 方法一&a…

静态工厂模式(简单工厂模式)与动态工厂模式(工厂方法模式)

1. 简单工厂模式 核心是定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离,降低系统的耦合度,使得两个修改起来相对容易些,当以后实现改变时,只需要修改工厂类即可。该模式对对象创建管理方式最为简单&#x…