Java 适配器模式(Adapter Pattern)详解
一、概念介绍
适配器模式(Adapter Pattern) 是一种结构型设计模式,用于将一个类的接口转换为客户端所期望的另一种接口。
它让原本由于接口不兼容而无法一起工作的类可以协同工作。
简单来说,适配器就像一个“接口转换器”,使得原本不兼容的接口能够配合使用。
二、生活类比
就像你出国旅行时,笔记本电脑的充电器插头是国标的,但当地的电源插孔是欧标的。
这时,你需要一个“插头转换器”来连接两者,这个“转换器”就是典型的适配器。
三、应用场景
适配器模式常用于以下场景:
- 系统中需要使用现有的类,但该类的接口不符合当前需求。
- 希望创建一个可以复用的类,让它能与不兼容的接口协同工作。
- 需要统一多个不同接口的类,以简化调用逻辑。
四、核心角色
目标接口(Target)
客户端期望使用的接口。被适配者(Adaptee)
已存在但接口不兼容的类。适配器(Adapter)
连接Target
和Adaptee
的桥梁,将一个接口转换成另一个接口。
五、代码示例
1. 定义目标接口
public interface MediaPlayer {
void play(String audioType, String fileName);
}
2. 定义被适配者类
public class AdvancedMediaPlayer {
public void playMp4(String fileName) {
System.out.println("Playing mp4 file: " + fileName);
}
public void playVlc(String fileName) {
System.out.println("Playing vlc file: " + fileName);
}
}
3. 定义适配器类
public class MediaAdapter implements MediaPlayer {
private AdvancedMediaPlayer advancedPlayer;
public MediaAdapter(String audioType) {
advancedPlayer = new AdvancedMediaPlayer();
}
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("mp4")) {
advancedPlayer.playMp4(fileName);
} else if (audioType.equalsIgnoreCase("vlc")) {
advancedPlayer.playVlc(fileName);
} else {
System.out.println("Unsupported format: " + audioType);
}
}
}
4. 定义客户端类
public class AudioPlayer implements MediaPlayer {
private MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("mp3")) {
System.out.println("Playing mp3 file: " + fileName);
} else {
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType, fileName);
}
}
}
5. 测试运行
public class AdapterPatternDemo {
public static void main(String[] args) {
AudioPlayer player = new AudioPlayer();
player.play("mp3", "song.mp3");
player.play("mp4", "video.mp4");
player.play("vlc", "movie.vlc");
player.play("avi", "unknown.avi");
}
}
运行结果
Playing mp3 file: song.mp3
Playing mp4 file: video.mp4
Playing vlc file: movie.vlc
Unsupported format: avi
总结
适配器模式的核心在于“兼容”:
当两个类因接口不兼容而无法协作时,使用适配器将一个类的接口转换为另一个类所期望的接口。
在 Java 开发中,适配器模式常见于:
各种 API 兼容层;
第三方库的整合;
Spring 框架的适配接口(如 HandlerAdapter)。
一句话总结:
适配器模式的目标是让原本不兼容的类能够一起工作,而不需要修改它们的源代码。