赞
踩
适配器模式是一种结构型设计模式,其用途是将一个类的接口转换成客户端所期望的另一种接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式通过创建一个实现目标接口的适配器类来实现,该适配器类存有一个对源类的实例的引用,并将请求重定向到源类的方法。通过这种方式,适配器类可以将目标接口和源接口之间的差异隐藏起来,使得它们可以协同工作。
适配器模式能够将不兼容的接口转换为客户端所期望的接口,从而使得原本不兼容的类可以协同工作。
适配器模式增加了代码的复杂性,增加了额外的软件层次,并可能降低性能。
适配器模式可应用于以下场景:
下面我们通过一个简单的实例来展示适配器模式的应用。假设我们有一个MP3播放器和一个普通CD播放器,现在需要将普通CD播放器接口转换为MP3播放器接口,以便让普通CD播放器能够兼容MP3播放器。这个问题可以通过适配器模式来解决。
首先,定义一个目标接口MediaPlayer
,该接口定义了MP3播放器所需的所有方法:
public interface MediaPlayer {
public void play(String audioType, String fileName);
}
然后,定义一个源类AdvancedMediaPlayer
,该类定义了普通CD播放器的接口:
public interface AdvancedMediaPlayer {
public void playVlc(String fileName);
public void playMp4(String fileName);
}
为了将普通CD播放器的接口转换为MP3播放器的接口,我们需要创建一个适配器类MediaAdapter
,该类实现了MediaPlayer
接口,并使用AdvancedMediaPlayer
接口来实现其方法:
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); } } }
最后,我们定义一个客户端类AudioPlayer
,该类实现了MediaPlayer
接口,并使用MediaAdapter
来适配普通CD播放器的接口:
public class AudioPlayer implements MediaPlayer { MediaAdapter mediaAdapter; @Override public void play(String audioType, String fileName) { //播放 mp3 音乐文件的内置支持 if(audioType.equalsIgnoreCase("mp3")){ System.out.println("Playing mp3 file. Name: " + fileName); } //mediaAdapter 提供了播放其他文件格式的支持 else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){ mediaAdapter = new MediaAdapter(audioType); mediaAdapter.play(audioType, fileName); } else{ System.out.println("Invalid media. " + audioType + " format not supported"); } } }
现在我们可以使用AudioPlayer
来播放MP3、VLC或MP4格式的音频文件,无论它们是由MP3播放器还是普通CD播放器提供的。
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");
}
输出结果如下:
Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media. avi format not supported
从输出结果可以看出,适配器模式使得普通CD播放器可以与MP3播放器的接口兼容,从而可以被AudioPlayer
所使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。