适配器模式
简介
适配器模式,旨在解决两个不相关的接口能够在一起工作,起到一个兼容的作用。
举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4
优点
1、可以让任何两个不相关的类一起运行
2、提高类的复用
3、增加了类的透明度
4、灵活性好
缺点
1、过多的使用适配器,会使系统非常的零乱,不易整体把握
UML
实现
public interface MediaPlayer {
public void play(String audioType,String fileName);
}
public interface AdvanceMediaPlayer {
public void playMp4(String fileName);
public void playVlc(String fileName);
}
public class Mp4Player implements AdvanceMediaPlayer{
@Override
public void playMp4(String fileName) {
System.out.println("mp4播放器播放文件:"+fileName);
}
@Override
public void playVlc(String fileName) {
//什么都不用做
}
}
public class VlcPlayer implements AdvanceMediaPlayer {
@Override
public void playMp4(String fileName) {
//什么都不用做
}
@Override
public void playVlc(String fileName) {
System.out.println("vlc播放器播放文件:"+fileName);
}
}
public class MediaAdapter implements MediaPlayer{
AdvanceMediaPlayer advanceMediaPlayer;
@Override
public void play(String audioType, String fileName) {
if ("vlc".equalsIgnoreCase(audioType)){
advanceMediaPlayer.playVlc(fileName);
}else if ("mp4".equalsIgnoreCase(audioType)){
advanceMediaPlayer.playMp4(fileName);
}
}
public MediaAdapter(String audioType){
if ("vlc".equalsIgnoreCase(audioType)){
advanceMediaPlayer = new VlcPlayer();
}else if ("mp4".equalsIgnoreCase(audioType)){
advanceMediaPlayer = new Mp4Player();
}
}
}
public class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
if ("mp3".equalsIgnoreCase(audioType)){
System.out.println("mp3播放器播放文件:"+fileName);
}else if ("mp4".equalsIgnoreCase(audioType) || "vlc".equalsIgnoreCase(audioType)){
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType,fileName);
}
}
}
public class Client {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3","平凡之路");
audioPlayer.play("mp4","mp4文件");
audioPlayer.play("vlc","vlc文件");
}
}