适配器模式
内容参考 W3c School
分类:结构性设计模式
应用:多媒体播放器
目录
创建媒体播放接口 AdvancedMediaPlayer MediaPlayer
UML类图
用户使用媒体播放器播放多媒体文件,再播放器中会自己判断文件的类型:Mp3 Mp4 Vlc等,如果是mp3音频则直接播放,如果是Mp4、Vlc的视频多媒体文件就调用多媒体文件适配器,在媒体适配器中,根据多媒体文件的类型来自动选择不同的播放源,然后进行播放。
创建媒体播放接口 AdvancedMediaPlayer MediaPlayer
AdvancedMediaPlayer
public interface AdvancedMediaPlayer {
/**
* 播放Vlc
* @param fileName 文件名
*/
void playVlc(String fileName);
/**
* 播放
* @param fileName 文件名称
*/
void playMp4(String fileName);
}
MediaPlayer
public interface MediaPlayer {
/**
* 播放多媒体文件
* @param audioType 媒体文件类型
* @param fileName 文件名
*/
void play(String audioType,String fileName);
}
创建播放实现类 Mp4Player VlcPlayer
Mp4Player
public class Mp4Player implements AdvancedMediaPlayer{
@Override
public void playVlc(String fileName) {}
@Override
public void playMp4(String fileName) {
System.out.println("[Mp4Player] Play:"+fileName);
}
}
VlcPlayer
public class VlcPlayer implements AdvancedMediaPlayer{
@Override
public void playVlc(String fileName) {
System.out.println("[VlcPlayer] Play:"+fileName);
}
@Override
public void playMp4(String fileName) {}
}
创建媒体适配器 MediaAdapter
public class MediaAdapter implements MediaPlayer{
AdvancedMediaPlayer advancedMediaPlayer;
private final String VLC = "vlc";
private final String MP4 = "mp4";
public MediaAdapter(String audioType){
if (VLC.equalsIgnoreCase(audioType)){
advancedMediaPlayer = new VlcPlayer();
}else if (MP4.equalsIgnoreCase(audioType)){
advancedMediaPlayer = new Mp4Player();
}
}
@Override
public void play(String audioType, String fileName) {
if (VLC.equalsIgnoreCase(audioType)){
advancedMediaPlayer.playVlc(fileName);
}else if (MP4.equalsIgnoreCase(audioType)){
advancedMediaPlayer.playMp4(fileName);
}
}
}
创建播放器 AudioPlayer
public class AudioPlayer implements MediaPlayer{
private MediaAdapter mediaAdapter;
private final String MP4 = "mp4";
private final String MP3 = "mp3";
private final String VLC = "vlc";
@Override
public void play(String audioType, String fileName) {
if (MP3.equalsIgnoreCase(audioType)){
System.out.println("[Playing] Mp3:"+fileName);
}else if (VLC.equalsIgnoreCase(audioType)|| MP4.equalsIgnoreCase(audioType)){
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType,fileName);
}else{
System.out.printf("[Error] 不支持该<%s>文件类型:%s\n",audioType,fileName);
}
}
}
测试运行
public class ExecuteMain {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3","Dream_it_possible.mp3");
audioPlayer.play("mp4","Dream_it_possible.mp4");
audioPlayer.play("vlc","Dream_it_possible.vlc");
audioPlayer.play("avi","Dream_it_possible.avi");
}
}
[Playing] Mp3:Dream_it_possible.mp3
[Mp4Player] Play:Dream_it_possible.mp4
[VlcPlayer] Play:Dream_it_possible.vlc
[Error] 不支持该<avi>文件类型:Dream_it_possible.avi
Process finished with exit code 0