适配器模式作为两个不兼容接口之间的桥梁,结合了两个独立接口的功能。
interface MediaPlayer {
public void play(String type, String fileName);
}
interface AdvancedMediaPlayer {
public void playVlc(String fileName);
public void playMp4(String fileName);
}
// mp4播放器和Vlc播放器有着不同的接口,与原来的mp3播放器的接口也是不同的
class Mp4Player implements AdvancedMediaPlayer{
@Override
public void playVlc(String fileName) {
}
@Override
public void playMp4(String fileName) {
}
}
class VlcPlayer implements AdvancedMediaPlayer{
@Override
public void playVlc(String fileName) {
}
@Override
public void playMp4(String fileName) {
}
}
// MediaAdapter包含除mp3之外的其他两种格式的文件的接口,从而使之形成一个适配器
class MediaAdapter {
AdvancedMediaPlayer player;
public MediaAdapter(String type) {
if (type.equals("vlc")) {
player = new VlcPlayer();
}
else if (type.equals("mp4") {
player = new Mp4Player();
}
}
@Overrride
public void play(String type, String fileName) {
if (type.equals("vlc") {
player.playVlc(fileName);
}
else if (type.equals("mp4") {
player.playMp4(fileName)
}
}
}
// AudioPlayer包含了一个适配器,使得其既能播放mp3,也可以播放其他两种格式的文件
class AudioPlayer implements MediaPlayer {
MediaAdapter adapter;
@Override
public void play(String type, String fileName) {
if (type.equals("mp3")) {
}
else if (type.equals("vlc") || type.equals("mp4")) {
adapter = new MediaAdapter(type);
adapter.play(type, fileName);
}
}
}
class AdapterPatternDemo {
public static void main(String[] args) {
AudioPlayer player = new AudioPlayer();
player.play("mp3", "song1.mp3");
player.play("mp4", "song1.mp4");
player.play("vlc", "song1.vlc");
}
}
最后上一张图加深理解:
上图的充电口有非常多种类型,但是通过一个集线器,在靠近充电口的另外一段,看起来就是没有差别的。对接近电源的充电口来说,他只知道我要往里面输送什么样的电压,什么样的电流,而不关心被连接的线是哪一条,被连接上的充电设备是什么。这个时候,集线器,就是充当一个适配器的作用。