适配器模式是作为两个不兼容接口的桥梁,是结构型模式。
意图
适配器使由于接口不兼容而不能一起工作的接口一起工作。
实现
我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。
我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。
我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。
AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo,我们的演示类使用 AudioPlayer 类来播放各种格式。
创建两个接口
public interface MediaPlayer {
void play(String type, String filename);
}
public interface AdvancedMediaPlayer {
void playVlc(String filename);
void playMp4(String filename);
}
创建实现AdvancedMediaPlayer接口的类
public class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playVlc(String filename) {
}
@Override
public void playMp4(String filename) {
System.out.println("play mp4 :" + filename);
}
}
public class Mp4Player implements AdvancedMediaPlayer{
@Override
public void playVlc(String fileName) {
//什么也不做
}
@Override
public void playMp4(String fileName) {
System.out.println("Playing mp4 file. Name: "+ fileName);
}
}
创建适配器
Adapter implements MediaPlayer {
private AdvancedMediaPlayer advancedMediaPlayer;
public Adapter(String type) {
if (type.equalsIgnoreCase("vlc")) {
advancedMediaPlayer = new VlcPlayer();
} else if (type.equalsIgnoreCase("mp4")) {
advancedMediaPlayer = new Mp4Player();
}
}
@Override
public void play(String type, String filename) {
if (type.equalsIgnoreCase("vlc")) {
advancedMediaPlayer.playVlc(filename);
} else if(type.equalsIgnoreCase("mp4")) {
advancedMediaPlayer.playMp4(filename);
} else {
System.out.println("invalid input");
}
}
}
创建AudioPlayer类
public class AudioPlayer implements MediaPlayer {
@Override
public void play(String type, String filename) {
if (type.equalsIgnoreCase("mp3")) {
System.out.println("play mp3 : " + filename);
} else if (type.equalsIgnoreCase("vlc") || type.equalsIgnoreCase("mp4")) {
Adapter adapter = new Adapter(type);
adapter.play(type, filename);
} else {
System.out.println("无效输入");
}
}
}
使用 AudioPlayer 来播放不同类型的音频格式。
public class AudioPlayer implements MediaPlayer {
@Override
public void play(String type, String filename) {
if (type.equalsIgnoreCase("mp3")) {
System.out.println("play mp3 : " + filename);
} else if (type.equalsIgnoreCase("vlc") || type.equalsIgnoreCase("mp4")) {
Adapter adapter = new Adapter(type);
adapter.play(type, filename);
} else {
System.out.println("无效输入");
}
}
}