原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。
适配器模式就是将两个不兼容的接口进行兼容处理。生活中比较常见的例子就是电源适配器。笔记本电脑一般都是5-20伏的低电压,市电是220伏的电压,这个时候就需要电源适配器的帮忙,将220伏电压转换成符合要求的低电压。
日常开发中经常会用到这个设计模式,A接口的提供的参数和方法不符合B接口的使用要求,但是双方改起来都比较困难,这个时候就可以考虑使用适配器模式。
举个例子
拿媒体播放器举例,假设播放器有个play()方法,只支持播放MP3格式的文件,这个时候底层硬件厂商提供了新的功能接口,可以支持vlc和MP4格式的文件播放,但是方法名称变成了playVLC()和palyMP4(),为了让播放器能够使用统一的play()方法实现三种文件的播放,需要引入适配器类,来调和两个不兼容的接口。
先来看一下该例子的UML图:
来看一下具体代码实现
public interface MediaPlayer {
void play(String audioType, String fileName);
}
//新的接口 实现Vlc和Mp4格式播放
public interface AdvancedMediaPlayer {
void playVlc(String fileName);
void playMp4(String fileName);
}
引入适配器,使AdvancedMediaPlayer
接口格式符合MediaPlayer
接口格式
public class MediaAdapter implements MediaPlayer {
AdvancedMediaPlayer advancedMusicPlayer;
public MediaAdapter(String audioType) {
if (audioType.equalsIgnoreCase("vlc")){
advancedMusicPlayer = new VlcPlayer();
}else if (audioType.equalsIgnoreCase("mp4")){
advancedMusicPlayer = new Mp4Player();
}
}
//注意这段代码逻辑
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("vlc")){
advancedMusicPlayer.playVlc(fileName);
}else if (audioType.equalsIgnoreCase("mp4")){
advancedMusicPlayer.playMp4(fileName);
}
}
}
看一下播放器的具体代码实现
public class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;
//支持多种格式播放
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("mp3")){
System.out.println("Playing mp3 file. Name: " + fileName);
}else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){
//播放vlc或mp4
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType,fileName);
}else {
System.out.println("Invalid media. " + audioType + " format not supported");
}
}
}
看一下客户端代码如何使用
public class AdapterPatternDemo {
public static void main(String[] args){
AudioPlayer audioPlayer = new AudioPlayer();
//调用方式都是统一的,适配器做了底层兼容
audioPlayer.play("mp3", "beyond the horizon.mp3");
audioPlayer.play("mp4", "alone.mp4");
audioPlayer.play("vlc", "far far away.vlc");
audioPlayer.play("avi", "mind me.avi");
}
}
总结
适配器模式是七种结构型模式之一,日常使用频率很高,经常用于调和两个不兼容的接口。
本文参考 www.tutorialspoint.com/design_patt…
推荐阅读