适配器模式(Adapter Pattern)属于结构型模式,是作为两个不兼容的接口之间的桥梁。这种类型的设计模式它结合了两个独立接口的功能。
主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。适配器继承或依赖已有的对象,实现想要的目标接口。
一个MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。AudioPlayer 只可以播放 mp3 格式的音频文件。
另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。它们可以播放 wav和alac 格式的音频文件。
如果想要让 AudioPlayer 播放wav和alac 格式的音频文件,需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。
AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。

package blog;
/**
* 媒体播放器
*/
public interface MediaPlayer {
void play(String type, String file);
}
package blog;
/**
* 高级媒体播放器
*/
public interface AdvancedMediaPlayer {
void playWav(String file);
void playAlac(String file);
}
package blog;
/**
* 音频播放器
*/
public class AudioPlayer implements MediaPlayer{
private MediaAdapter mediaAdapter;
@Override
public void play(String type, String file) {
if ("mp3".equals(type)) {
System.out.println("播放mp3格式的音频文件:" + file);
return;
}
if ("wav".equals(type) || "alac".equals(type)) {
mediaAdapter = new MediaAdapter(type);
mediaAdapter.play(type, file);
return;
}
System.out.println("播放器不支持"+ type +"格式的文件");
}
}
package blog;
/**
* wav格式播放器
*/
public class WavPlayer implements AdvancedMediaPlayer{
@Override
public void playWav(String file) {
System.out.println("播放wav格式的音频文件:" + file);
}
@Override
public void playAlac(String file) {
}
}
package blog;
/**
* alac格式播放器
*/
public class AlacPlayer implements AdvancedMediaPlayer{
@Override
public void playWav(String file) {
}
@Override
public void playAlac(String file) {
System.out.println("播放alac格式的音频文件:" + file);
}
}
package blog;
/**
* 媒体适配器
*/
public class MediaAdapter implements MediaPlayer{
private AdvancedMediaPlayer advancedMediaPlayer;
public MediaAdapter(String type) {
if ("wav".equals(type)) {
advancedMediaPlayer = new WavPlayer();
}
if ("alac".equals(type)) {
advancedMediaPlayer = new AlacPlayer();
}
}
@Override
public void play(String type, String file) {
if ("wav".equals(type)) {
advancedMediaPlayer.playWav(file);
}
if ("alac".equals(type)) {
advancedMediaPlayer.playAlac(file);
}
}
}
package blog;
public class AdapterDemo {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "阳光男孩");
audioPlayer.play("wav", "你的背包");
audioPlayer.play("alac", "一千年以后");
audioPlayer.play("ape", "后会无期");
}
}