适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式允许原本不兼容的类能够合作无间。
在软件开发中,适配器模式经常用于以下情况:
适配器模式包含以下几个角色:
下面是一个简单的示例,展示适配器模式的使用:
// 目标接口
interface MediaPlayer {
void play(String audioType, String fileName);
}
// 适配者接口
interface AdvancedMediaPlayer {
void playVlc(String fileName);
void playMp4(String fileName);
}
// 适配者实现类
class VlcPlayer implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
System.out.println("Playing vlc file: " + fileName);
}
@Override
public void playMp4(String fileName) {
// 什么也不做
}
}
class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
// 什么也不做
}
@Override
public void playMp4(String fileName) {
System.out.println("Playing mp4 file: " + fileName);
}
}
// 适配器类
class MediaAdapter implements MediaPlayer {
private 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);
}
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
MediaPlayer mediaPlayer = new MediaAdapter("mp4");
mediaPlayer.play("mp4", "movie.mp4");
}
}
在上面的示例中,我们有一个目标接口 MediaPlayer,定义了播放音频的方法 play。然后我们有两个适配者接口 AdvancedMediaPlayer,分别用于播放 vlc 和 mp4 格式的音频。适配器类 MediaAdapter 实现了目标接口,并持有适配者对象,将目标接口的方法调用转发给适配者对象。
在客户端代码中,我们创建了一个适配器对象 MediaAdapter,并调用了 play 方法来播放 mp4 格式的音频。适配器内部会将该调用转发给适配者对象 Mp4Player,从而实现了适配器模式的适配功能。
适配器模式使得原本不兼容的类能够协同工作,提高了代码的复用性和灵活性。