一、背景
试想现在有两个接口,接口a正在被A使用,接口b正在被B使用(a不适用B,b不适用A),如果现在A要使用b怎么办?重新写一个a类型的 带有b功能的接口?这样是不是太重复,太麻烦了,所以适配器模式便产生了。
二、概念
适配器模式,顾名思义,最核心的思想便是适配。就想我们的充电器 苹果充电器想要充安卓机怎么办?那还不简单,加一个转接头呗。同理,适配器模式也是如此,将一个类的接口转化为用户期待的接口,适配器模式使得原本因接口不兼容而不能一起工作的类一起工作。
三、代码实例
比如现在让一个播放MP3的媒体播放器也能播放MP4和VLC
/**
* @author xyp 适配器模式
*/
public class AdapterPatternDemo {
public static void main(String agrs[]) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3");
audioPlayer.play("vlc");
audioPlayer.play("mp4");
audioPlayer.play("3D");
}
}
interface Mp4AndVlcMediaPlayer {// mp4 和 vlc播放器接口
public void mp4();
public void vlc();
}
class MP4Player implements Mp4AndVlcMediaPlayer {// mp4播放器
@Override
public void mp4() {
System.out.println("play mp4");
}
@Override
public void vlc() {
}
}
class VLCPlayer implements Mp4AndVlcMediaPlayer {// vlc播放器
@Override
public void mp4() {
}
@Override
public void vlc() {
System.out.println("paly VLC");
}
}
/*
* 现在要能播放MP3的播放器也能播放MP4及VLC,那么加一个适配器
*/
interface MediaPlay {
public void play(String s);
}
class AudioPlayer implements MediaPlay {
@Override
public void play(String s) {
if ("mp3".equals(s)) {
System.out.println("play mp3");
} else if ("mp4".equals(s) || "vlc".equals(s)) {// 通适配器来播放MP4和vlc格式
MediaPlay madaper = new MediaPlayAdapter(s);
madaper.play(s);
} else {
System.out.println("not supported!");
}
}
}
class MediaPlayAdapter implements MediaPlay {// 适配器
private Mp4AndVlcMediaPlayer mp4AndVlcMediaPlayer;
public MediaPlayAdapter(String s) {
if ("mp4".equals(s)) {
mp4AndVlcMediaPlayer = new MP4Player();
}
if ("vlc".equals(s)) {
mp4AndVlcMediaPlayer = new VLCPlayer();
}
}
@Override
public void play(String s) {
if ("mp4".equals(s)) {
this.mp4AndVlcMediaPlayer.mp4();
}
if ("vlc".equals(s)) {
this.mp4AndVlcMediaPlayer.vlc();
}
}
}