**适配器模式(Adapter Pattern)**是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口,从而使原本由于接口不兼容而无法一起工作的类能够一起工作。
适配器模式主要有三个角色:
目标接口(Target):客户端期望的接口,客户端通过调用目标接口来使用特定功能。
源接口(Adaptee):需要被适配的现有接口,它是客户端无法直接使用的接口。
适配器(Adapter):实现目标接口,并包含一个源接口的引用,通过对源接口的适配转换,将客户端的请求委托给源接口处理。
适配器模式可以解决以下场景:
在使用第三方库或遗留代码时,其接口可能与当前系统的接口不兼容,使用适配器模式可以快速适配。
当希望在不修改现有代码的情况下复用某个类,但该类的接口不符合当前系统要求时,可以使用适配器模式来进行接口转换。
示例:
假设我们有一个音频播放器,可以播放MP3格式的音频文件。但现在有一个新的音频格式WAV,我们需要在不修改现有播放器代码的情况下,支持WAV格式的音频文件播放。我们可以使用适配器模式来实现:
// 目标接口:音频播放器
interface MediaPlayer {
void play(String audioType, String fileName);
}
// 源接口:MP3播放器
class Mp3Player {
public void playMp3(String fileName) {
System.out.println("播放MP3音频:" + fileName);
}
}
// 适配器类:适配MP3播放器到音频播放器接口
class Mp3Adapter implements MediaPlayer {
private Mp3Player mp3Player;
public Mp3Adapter(Mp3Player mp3Player) {
this.mp3Player = mp3Player;
}
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("MP3")) {
mp3Player.playMp3(fileName);
} else {
System.out.println("不支持的音频格式:" + audioType);
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
MediaPlayer player = new Mp3Adapter(new Mp3Player());
player.play("MP3", "song.mp3"); // 输出:播放MP3音频:song.mp3
player.play("WAV", "song.wav"); // 输出:不支持的音频格式:WAV
}
}