适配器模式简介
-
适配器模式(Adapter Pattern)是作为不兼容的接口之间的桥梁。
-
这种模式涉及到一个单一的类(AdapterClass),该类负责加入独立的或不兼容的接口功能。
-
意图就是使用一个接口通过适配的过程得到需要的接口。
-
适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
-
关键代码:适配器要有想要的目标的接口。
-
应用实例: 1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。 2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。 3、在 LINUX 上运行 WINDOWS 程序。 4、JAVA 中的 jdbc。
-
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
-
缺点: 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
-
简单来说就好像是一个万能充, 通过一个适配的过程,可以给很多手机充电, 下面我是有代码演示一个媒体播放的适配过程, 也就是无论你使用的是什么类型的媒体文件MP3、mp4、vlc我都会进行适配, 让播放
实现
- 抽象的高级播放器接口
public interface AdvancedPlayer {
}
- 实现播放的接口
public interface Player {
void play(String data, String fileName);
}
- MP3播放器
public class Mp3Player implements AdvancedPlayer {
}
- MP4播放器
public class Mp4Player implements AdvancedPlayer {
}
- VLC播放器
public class VlcPlayer implements AdvancedPlayer {
}
- 适配器
class AdapterException extends Exception {
public AdapterException(String message) {
super(message);
}
}
public class MediaAdapter implements Player {
private AdvancedPlayer advancedPlayer;
public MediaAdapter(String type) throws AdapterException {
adapter(type);
}
private void adapter(String type) throws AdapterException {
if ("mp3".equalsIgnoreCase(type)) {
advancedPlayer = new Mp3Player();
} else if ("mp4".equalsIgnoreCase(type)) {
advancedPlayer = new Mp4Player();
} else if ("vlc".equalsIgnoreCase(type)) {
advancedPlayer = new VlcPlayer();
} else {
throw new AdapterException("Type Not Find");
}
}
@Override
public void play(String data, String fileName) {
System.out.println(advancedPlayer.getClass().getName() + ": " + fileName + " date:" + data);
}
}
- 传入数据的统一处理
public class AudioPlayer {
public void play(String type, String data, String filename) {
try {
MediaAdapter adapter = new MediaAdapter(type);
adapter.play(data, filename);
} catch (AdapterException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
}
- 演示
public class Demo {
public static void main(String[] args) {
AudioPlayer player = new AudioPlayer();
player.play("mp3", "**************", "哈哈哈");
player.play("mp4", "+++++++++++++++", "呵呵呵");
player.play("vlc", "&&&&&&&&&&&&&&&", "嘻嘻嘻");
player.play("mp5", "###############", "略略略");
}
}