Adapter Pattern, 即适配器模式,用于连接两个不兼容的接口,属于结构类的设计模式。 或者叫做,转换器模式。
下面是一个转换器模式简单案例。
假设已有 AudioPlayer 专门播放 mp3 格式文件,VlcPlayer 和 Mp4Player 是高级播放器,分别播放 vlc 和 mp4 格式文件,客户端代码调用 AudioPlayer 来播放 mp3 格式的文件。
此时,不想修改 AudioPlayer 和 AdvanceMediaPlayer 的接口,也不希望修改客户端 AdapterPatternDemo 调用播放功能的方式,却能扩展地播放 vlc 和 mp4 格式的文件。
通过在 AudioPlayer 和 AdvanceMediaPlayer 直接增加一层适配器,能实现需要的效果。
代码实现:
AdvanceMediaPlayer 接口
public interface AdvanceMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName);
}
Mp4Player / VlcPlayer 类的实现,实现 AdvanceMediaPlayer 接口
public class Mp4Player implements AdvanceMediaPlayer { @Override
public void playVlc(String fileName) {
// do nothing
} @Override
public void playMp4(String fileName) {
System.out.println("Mp4player - playMp4 playing :" + fileName);
}
}
public class VlcPlayer implements AdvanceMediaPlayer { @Override
public void playVlc(String fileName) {
System.out.println("VlcPlayer - playVlc playing :" + fileName);
} @Override
public void playMp4(String fileName) {
// do nothings
}
}
MediaPlayer 接口
public interface MediaPlayer { public void play(String format, String fileName);
}
MediaAdapter ,提供播放 vlc 和 mp4 格式的转换功能
public class MediaAdapter implements MediaPlayer { AdvanceMediaPlayer vlcPlayer;
AdvanceMediaPlayer mp4Player; public MediaAdapter(){
vlcPlayer = new VlcPlayer();
mp4Player = new Mp4Player();
} @Override
public void play(String format, String fileName) {
if ("vlc".equals(format)){
vlcPlayer.playVlc(fileName);
}
else if ("mp4".equals(format)){
mp4Player.playMp4(fileName);
}
}
}
AudioPlayer,内置播放 mp3 格式功能,同时内含一个适配器用于播放其他格式文件
public class AudioPlayer implements MediaPlayer { private MediaAdapter mediaAdapter = new MediaAdapter(); @Override
public void play(String format, String fileName) { if ("mp3".equals(format)){
System.out.println("AudioPlayer - paly : mp3 ");
}
else if ("mp4".equals(format) || "vlc".equals(format)){
mediaAdapter.play(format, fileName);
}
else{
System.out.println("Invalid format file");
}
}
}
演示代码,客户端 AdapterPatternDemo ,使用同一个接口、方式,即可播放除了 mp3 之外的其他格式文件。
public class AdapterPatternDemo { public static void main(){
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "aaa.mp3");
audioPlayer.play("mp4", "bbb.mp4");
audioPlayer.play("vlc", "bbb.vlc");
audioPlayer.play("qqq", "bbb.vlc");
}
}
参考资料