1、介绍
适配器模式的产生,主要是为了解决在软件系统中,对于一些类,它们的接口并不能满足我们的需求,或者我们希望将一个类的接口转换为另一个我们需要的接口。例如,我们在使用一个第三方库时,它提供的API和我们的系统不兼容,或者在一个老系统中,由于历史原因,我们需要将旧的接口转换为新的接口。
适配器模式就像是一个电源适配器,将插头转换为我们电源插座可以接受的类型。如果没有电源适配器,我们可能需要更换设备的电源线或者更换整个设备,这无疑会带来额外的成本和麻烦。而有了电源适配器,我们只需要将它连接到设备和电源插座之间,就可以解决问题。
适配器模式就是这样一种设计模式,它可以将一个类的接口转换为客户期望的另一个接口,使得原本因接口不兼容不能一起工作的那些类可以一起工作。在许多软件系统中,当我们需要集成第三方库,或者需要在新旧系统之间进行过渡时,适配器模式都是一种非常实用的解决方案。
2、生活实例
想象一下,你从美国去欧洲旅行,带了一堆电子设备。但在欧洲,你发现你的充电器无法插入墙壁插座,因为插头的形状不同。此时,你需要一个插头转换器(也就是电源适配器)来解决问题。这个插头转换器就像一个适配器,它在你的充电器和墙壁插座之间起到桥梁的作用,让它们可以一起工作。
3、java代码实例
在这个示例中,假设我们有一个现有的 MediaPlayer 接口和一个实现了 MediaPlayer 接口的 AudioPlayer 类。现在,我们希望 AudioPlayer 也能播放其他格式的音频,比如 mp4 和 vlc,但我们不想修改 AudioPlayer 的代码。
首先,我们创建一个 AdvancedMediaPlayer 接口,它定义了播放 vlc 和 mp4 格式的方法。
public interface AdvancedMediaPlayer {
void playVlc(String fileName);
void playMp4(String fileName);
}
然后,我们创建两个实现了 AdvancedMediaPlayer 接口的类 VlcPlayer 和 Mp4Player。
public class VlcPlayer implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
System.out.println("Playing vlc file. Name: " + fileName);
}
@Override
public void playMp4(String fileName) {
// Do nothing
}
}
public class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
// Do nothing
}
@Override
public void playMp4(String fileName) {
System.out.println("Playing mp4 file. Name: " + fileName);
}
}
接下来,我们创建一个 MediaPlayer 接口的适配器类 MediaAdapter,让它也可以使用 AdvancedMediaPlayer 的功能。
public class MediaAdapter implements MediaPlayer {
AdvancedMediaPlayer advancedMediaPlayer;
public MediaAdapter(String audioType) {
if (audioType.equalsIgnoreCase("vlc")) {
advancedMediaPlayer = new VlcPlayer();
} else if (audioType.equalsIgnoreCase("mp4")) {
advancedMediaPlayer = new Mp4Player();
}
}
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("vlc")) {
advancedMediaPlayer.playVlc(fileName);
} else if (audioType.equalsIgnoreCase("mp4")) {
advancedMediaPlayer.playMp4(fileName);
}
}
}
最后,我们在 AudioPlayer 类中使用 MediaAdapter,使它可以播放所有格式的音频。
public class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("mp3")) {
System.out.println("Playing mp3 file. Name: " + fileName);
} else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType, fileName);
} else {
System.out.println("Invalid media. " + audioType + " format not supported");
}
}
}
现在,AudioPlayer 可以播放 mp3、mp4 和 vlc 格式的音频了,而且我们并没有修改 AudioPlayer 的源代码。