说明
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
简单来说:作为两个不同接口的桥梁,负责加入不同的接口功能。
举例
例如,常见的电源适配器,我们都知道家庭常用的电源电压都是220V的,但是手机电压一般是5V的,手机的充电器头就是一个适配器,将220V转换成5V。
关键代码实现
适配器继承或依赖(推荐)已有的对象,实现想要的目标接口。
代码示例:
播放普通音乐的接口
/**
* 媒体播放器接口-播放普通MP3格式的音乐
*
*/
public interface MediaPlayer {
/**
* 播放
*/
void play(String audioType, String fileName);
}
实现类, 原先只能播放普通MP3格式的音乐,通过适配器模式扩展,使其可以支持MP4、VLC格式。
/**
* 原先只能播放普通MP3格式的音乐,通过适配器模式扩展,使其可以支持MP4、VLC格式
*/
public class AudioPlayer implements MediaPlayer {
private AudioAdapter audioAdapter = new AudioAdapter();
/**
* 播放
*/
@Override
public void play(String audioType, String fileName) {
if ("mp3".equalsIgnoreCase(audioType)) {
System.out.println("播放MP3格式的音乐。。。");
} else if (List.of("mp4", "vlc").contains(audioType)) {
audioAdapter.play(audioType, fileName);
}
}
高级音乐播放器接口
/**
* 高级音乐播放器
*/
public interface AdvancedAudioPlayer {
/**
* 播放
*/
void play();
}
高级音乐播放器接口实现
/**
* 高级播放器
*
*/
public class MP4Player implements AdvancedAudioPlayer {
@Override
public void play() {
System.out.println("播放MP4");
}
}
/**
* 播放VLC格式的音乐
*/
public class VLCPlayer implements AdvancedAudioPlayer {
@Override
public void play() {
System.out.println("播放VLC格式的音乐");
}
}
适配器类
/**
* 播放音乐adapter适配器
*
*/
public class AudioAdapter implements MediaPlayer {
private AdvancedAudioPlayer mp4Player = new MP4Player();
private AdvancedAudioPlayer vlcPlayer = new VLCPlayer();
@Override
public void play(String audioType, String fileName) {
if ("mp4".equalsIgnoreCase(audioType)) {
mp4Player.play();
} else if ("vlc".equalsIgnoreCase(audioType)) {
vlcPlayer.play();
}
}
}
测试类
public class AdapterDesignTest {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "枫.mp3");
audioPlayer.play("mp4", "枫.mp4");
audioPlayer.play("vlc", "枫.vlc");
}
}
说明
原先普通音乐播放器接口MediaPlayer的实现类AudioPlayer只能播放MP3格式的音乐。通过适配器AudioAdapter实现了MediaPlayer接口,而适配器本身通过依赖高级播放器接口AdvancedAudioPlayer的实现类MP4Player和VLCPlayer实现了播放MP4格式和VLC格式的音频。
适配器的作用:通过适配器,将原先不能同时一起工作的两个接口可以一起工作。简单来说就是通过适配器类,使原先的接口获得其他接口的功能。