適配器模式
作爲兩個不兼容的接口之間的橋樑,結合了兩個獨立接口的功能。
- 優點
- 可以讓任何兩個沒有關聯的類一起運行。
- 提高了類的複用。
- 增加了類的透明度。
- 靈活性好。
- 缺點
- 過多地使用適配器,會讓系統非常零亂,不易整體進行把握。
// 播放器接口
public interface MediaPlayer {
public void play(String audioType, String fileName);
}
// 拓展播放器接口
public interface AdvancedMediaPlayer {
public void playFlv(String fileName);
public void playMp4(String fileName);
}
// FLV播放器
public class FlvPlayer implements AdvancedMediaPlayer{
@Override
public void playFlv(String fileName) {
System.out.println("播放FLV文件: "+ fileName);
}
@Override
public void playMp4(String fileName) {
//什麼也不做
}
}
// MP4播放器
public class Mp4Player implements AdvancedMediaPlayer{
@Override
public void playFlv(String fileName) {
//什麼也不做
}
@Override
public void playMp4(String fileName) {
System.out.println("播放MP4文件: "+ fileName);
}
}
// 播放器適配器
public class MediaAdapter implements MediaPlayer {
AdvancedMediaPlayer advancedMusicPlayer;
public MediaAdapter(String audioType){
if(audioType.equalsIgnoreCase("FLV") ){
advancedMusicPlayer = new FlvPlayer();
} else if (audioType.equalsIgnoreCase("MP4")){
advancedMusicPlayer = new Mp4Player();
}
}
@Override
public void play(String audioType, String fileName) {
if(audioType.equalsIgnoreCase("FLV")){
advancedMusicPlayer.playFlv(fileName);
} else if(audioType.equalsIgnoreCase("MP4")){
advancedMusicPlayer.playMp4(fileName);
}
}
}
// 音頻播放器
public class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
// mediaAdapter 提供了播放其他文件格式的支持
if(audioType.equalsIgnoreCase("FLV") || audioType.equalsIgnoreCase("MP4")){
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType, fileName);
} else if(audioType.equalsIgnoreCase("MP3")){
// 內置支持MP3文件
System.out.println("播放MP3文件: "+ fileName);
} else{
System.out.println("不支持文件格式:" + audioType);
}
}
}
// 使用示例
public class Demo {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "a.mp3");
audioPlayer.play("mp4", "b.mp4");
audioPlayer.play("flv", "c.flv");
audioPlayer.play("avi", "d.avi");
}
}