[Design Pattern] Adapter Pattern 简单案例
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"); } }
参考资料
Design Patterns - Adapter Pattern, TutorialsPoint