**适配器模式(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;}@Overridepublic 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.mp3player.play("WAV", "song.wav"); // 输出:不支持的音频格式:WAV}
}