一、什么是适配器模式

看到这张图,很自然就能想象结构型模式的适配器模式。
适配器模式(Adapter Pattern)是作为两个不兼容(不存在继承关系)的接口之间的桥梁。
二、适配器模式简介与实例讲解
在实践中,旧版本存在一个MediaPlayer接口,在新版本中存在设计更完备的增强接口AdvancedMediaPlayer接口,AdvancedMediaPlayer的实现类实现了更多的功能,但为了兼容需求,还要对部分用户提供MediaPlayer接口,我们通过适配器,将AdvancedMediaPlayer转换为MediaPlayer接口。
适配器模式包含一下三个角色:
- Target(目标类):如MediaPlayer,目标类是一个接口,它是“被适配类”希望变成的样子。
- Adaptee(被适配类):如AdvancedMediaPlayer。它们拥有已经存在的接口,通常与目标不一致。
- Adapter(适配器类):作为一个转换器或包装器,是目标类的实现类,如MediaPlayerAdapter。
下图为这几个角色之间的UML关系图。
下面是MediaPlayer的的接口定义,以及实现类Mp3Player。
//旧版本的MediaPlayer接口public interface MediaPlayer {public void play(String audioType, String fileName);}//实现了MediaPlayer接口,播放mp3格式public class Mp3Player implements MediaPlayer {@Overridepublic void play(String audioType, String fileName) {if ("Mp3".equalsIgnoreCase(audioType))System.out.println("Playing Mp3 file. Name: " + fileName);elseSystem.out.println("Invalid media. " + audioType + " format not supported");}}
下面是AdvancedMediaPlayer的接口定义,以及实现类VlcPlayer和Mp4Player。
//AdvancedMediaPlayer增强接口public interface AdvancedMediaPlayer {public void playMax(String audioType, String fileName);}//实现了AdvancedMediaPlayer接口,播放vlc格式public class VlcPlayer implements AdvancedMediaPlayer {@Overridepublic void playMax(String audioType, String fileName) {if ("Vlc".equalsIgnoreCase(audioType))System.out.println("Playing Vlc file. Name: " + fileName);elseSystem.out.println("Invalid media. " + audioType + " format not supported");}}//实现了AdvancedMediaPlayer接口,播放mp4格式public class Mp4Player implements AdvancedMediaPlayer {@Overridepublic void playMax(String audioType, String fileName) {if ("Mp4".equalsIgnoreCase(audioType))System.out.println("Playing Mp4 file. Name: " + fileName);elseSystem.out.println("Invalid media. " + audioType + " format not supported");}}
下面是MediaPlayer的适配器MediaPlayerAdapter,实现了MediaPlayer接口,将AdvancedMediaPlayer作为成员变量,调用AdvancedMediaPlayer方法重写MediaPlayer接口play方法。
//适配类public class MediaPlayerAdapter implements MediaPlayer {AdvancedMediaPlayer advancedMusicPlayer;public MediaAdapter(String audioType) {if (audioType.equalsIgnoreCase("Vlc")) {advancedMusicPlayer = new VlcPlayer();} else if (audioType.equalsIgnoreCase("Mp4")) {advancedMusicPlayer = new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("vlc")) {advancedMusicPlayer.playMax(fileName);} else if (audioType.equalsIgnoreCase("Mp4")) {advancedMusicPlayer.playMax(fileName);}}}
之后我们便可以使用需要的创建型设计模式来创建对象。
