一、什么是适配器模式
看到这张图,很自然就能想象结构型模式的适配器模式。
适配器模式(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 {
@Override
public void play(String audioType, String fileName) {
if ("Mp3".equalsIgnoreCase(audioType))
System.out.println("Playing Mp3 file. Name: " + fileName);
else
System.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 {
@Override
public void playMax(String audioType, String fileName) {
if ("Vlc".equalsIgnoreCase(audioType))
System.out.println("Playing Vlc file. Name: " + fileName);
else
System.out.println("Invalid media. " + audioType + " format not supported");
}
}
//实现了AdvancedMediaPlayer接口,播放mp4格式
public class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playMax(String audioType, String fileName) {
if ("Mp4".equalsIgnoreCase(audioType))
System.out.println("Playing Mp4 file. Name: " + fileName);
else
System.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();
}
}
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("vlc")) {
advancedMusicPlayer.playMax(fileName);
} else if (audioType.equalsIgnoreCase("Mp4")) {
advancedMusicPlayer.playMax(fileName);
}
}
}
之后我们便可以使用需要的创建型设计模式来创建对象。