原文連接
譯者:smallclover
我的翻譯,水平有限,若有錯誤歡迎指出,謝謝!java
適配器模式做爲橋樑,鏈接兩個不兼容的接口。這種類型的設計模式來源於結構型模式,它具備結合兩個相互獨立的接口的能力。設計模式
這個模式涉及到單個類,該類負責接入獨立的、不兼容的接口。一個現實生活的例子,好比說讀卡器,它可能會在記憶卡和筆記本電腦之間扮演一個適配者的角色。首先把記憶卡插到讀卡器上,在把讀卡器插入筆記本上,而後咱們就能夠從筆記本讀取記憶卡上的數據。
咱們經過如下的例子來展現適配器模式。一個音頻播放器設備只能播放mp3文件;而另外一個比較先進的音樂播放器能夠播放vlc和mp4文件。ide
咱們有一個MediaPlayer
接口和一個實現該接口的實體類AudioPlayer
,這個AudioPlayer
默認播放mp3格式的音頻。spa
咱們還有另一個接口 AdvancedMediaPalyer
和實現該接口的實體類
這些實體類能夠播放vlc和mp4格式的音頻。翻譯
咱們但願AudioPlayer
也能夠播放其餘格式的文件。爲了實現這個目標,咱們建立了一個適配器類MediaAdapter
,該類實現了接口MediaPlayer
,而且使用AdvancedMediaPlayer
的對象來播放須要的格式。設計
AudioPlayer
使用適配器類 MediaAdapter
,經過它來播放所指望的音頻類型,不須要知道實際是哪一個類播放這個指望的音頻類型。AdapterPatternDemo
,咱們的demo類將使用AudioPlayer
類來播放各類格式的音頻。code
建立MediaPlayer
和AdvancedMediaPlayer
接口。
MediaPlayer.javaorm
public interface MediaPlayer { public void play(String audioType, String fileName); }
AdvancedMediaPlayer.javahtm
public interface AdvancedMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName); }
建立實體類實現AdvancedMediaPlayer
接口。
VlcPlayer.java對象
public class VlcPlayer implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { System.out.println("Playing vlc file. Name: "+ fileName); } @Override public void playMp4(String fileName) { //什麼 } }
Mp4Player.java
public class Mp4Player implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { //什麼也不作 } @Override public void playMp4(String fileName) { System.out.println("Playing mp4 file. Name: "+ fileName); } }
建立一個適配器類實現MediaPlayer
接口
MediaAdapter.java
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); } } }
建立實體類實現MediaPlayer
接口。
AudioPlayer.java
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
播放不一樣種類的音頻格式。
AdapterPatternDemo.java
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"); } }
校驗輸出。
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