适配器模式将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
在适配器模式中,无涯教程通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作
通过以下示例演示适配器模式的使用,在该示例中,音频播放器设备只能播放mp3文件,并且希望使用能够播放vlc和mp4文件的高级音频播放器。
有一个 MediaPlayer 接口和一个实现 MediaPlayer 接口的具体类 AudioPlayer 。 AudioPlayer 默认情况下可以播放mp3格式的音频文件。
还有另一个接口 AdvancedMediaPlayer 和实现 AdvancedMediaPlayer 接口的具体类。这些类可以播放vlc和mp4格式的文件。
无涯教程希望使 AudioPlayer 也能播放其他格式。为此,创建了一个适配器类 MediaAdapter ,该类实现了 MediaPlayer 接口并使用 AdvancedMediaPlayer 对象播放所需的格式。
AudioPlayer 使用适配器类 MediaAdapter 向其传递所需的音频类型,而不知道可以播放所需格式的实际类。 AdapterPatternDemo ,演示类将使用 AudioPlayer 类播放各种格式。
第1步 - 为Media Player和Advanced Media Player创建接口。
MediaPlayer.java
public interface MediaPlayer { public void play(String audioType, String fileName); }
AdvancedMediaPlayer.java
public interface AdvancedMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName); }
第2步 - 创建实现 AdvancedMediaPlayer 接口的具体类。
VlcPlayer.java
public class VlcPlayer implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { System.out.println("Playing vlc file. Name: "+ fileName); } @Override public void playMp4(String fileName) { //do nothing } }
Mp4Player.java
public class Mp4Player implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { //do nothing } @Override public void playMp4(String fileName) { System.out.println("Playing mp4 file. Name: "+ fileName); } }
第3步 - 创建实现 MediaPlayer 接口的适配器类。
MediaAdapter.java
public 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(); } } @Override public void play(String audioType, String fileName) { if(audioType.equalsIgnoreCase("vlc")){ advancedMusicPlayer.playVlc(fileName); } else if(audioType.equalsIgnoreCase("mp4")){ advancedMusicPlayer.playMp4(fileName); } } }
第4步 - 创建实现 MediaPlayer 接口的具体类。
AudioPlayer.java
public class AudioPlayer implements MediaPlayer { MediaAdapter mediaAdapter; @Override public void play(String audioType, String fileName) { //内置支持播放 mp3 音乐文件 if(audioType.equalsIgnoreCase("mp3")){ System.out.println("Playing mp3 file. Name: " + fileName); } //mediaAdapter 正在提供播放其他文件格式的支持 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"); } } }
第5步 - 使用AudioPlayer播放不同类型的音频格式。
AdapterPatternDemo.java
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"); } }
第6步 - 验证输出。
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
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)