生活中常常會到這種問題,例如中國的標準電壓是220v,美國則是110v。若是想要在美國使用中國的電器,咱們須要有一個電壓適配器做爲中間橋樑進行電壓的轉換。
java
適配器模式就是這樣的功能,是兩個不兼容的接口的橋樑,屬於一種結構型模式,結合了兩個接口的功能。ide
如今有一個媒體播放器,有兩個子類,一個播放器能夠播放mp4格式文件,一個能夠播放vlc格式文件:測試
/** * 播放器接口 * @author 櫻桃肉丸子 */ public interface AdvancedMediaPlayer { void playVlc(String fileName); void playMp4(String fileName); }
/** * MP4播放器 * @author 櫻桃肉丸子 */ public class Mp4Player implements AdvancedMediaPlayer { @Override public void playVlc(String fileName) { //do nothing } @Override public void playMp4(String fileName) { System.out.println("mp4播放"); } }
/** * VLC播放器 * @author 櫻桃肉丸子 */ public class VlcPlayer implements AdvancedMediaPlayer { @Override public void playVlc(String fileName) { System.out.println("VLC播放"); } @Override public void playMp4(String fileName) { //do nothing } }
至此,咱們如今能夠播放mp4和vlc格式的文件了,可是此時有一個更高的要求,就是但願有一個播放器能夠同時播放mp4和vlc格式的文件,此時建立一個接口來表示更高級的播放器:接口
/** * 更高級的播放器接口 * @author 櫻桃肉丸子 */ public interface MediaPlayer { void play(String audioType, String fileName); }
此時,咱們須要建立一個適配器。這個適配器能夠根據咱們的需求自動轉換爲響應的播放器 。
it
/** * 適配器實現類 * @author 櫻桃肉丸子 */ public class MediaAdapter implements MediaPlayer{ AdvancedMediaPlayer advancedMediaPlayer; public MediaAdapter(String audioType){ if(audioType.equalsIgnoreCase("vlc") ){ advancedMediaPlayer = new VlcPlayer(); } else if (audioType.equalsIgnoreCase("mp4")){ advancedMediaPlayer = new Mp4Player(); } } @Override public void play(String audioType, String fileName) { if(audioType.equalsIgnoreCase("vlc")){ advancedMediaPlayer.playVlc(fileName); }else if(audioType.equalsIgnoreCase("mp4")){ advancedMediaPlayer.playMp4(fileName); } } }
此時建立高級播放器的子類來實現播放的功能。該類經過適配器達到靈活播放的效果。io
/** * 自動播放器 * @author 櫻桃肉丸子 */ public class AudioPlayer implements MediaPlayer { MediaAdapter mediaAdapter; @Override public void play(String audioType, String fileName) { //內置mp3播放器 if("mp3".equalsIgnoreCase(audioType)){ System.out.println("播放mp3文件"); //mp4或vlc格式文件 }else if("mp4".equalsIgnoreCase(audioType) || "vlc".equalsIgnoreCase(audioType)){ mediaAdapter = new MediaAdapter(audioType); mediaAdapter.play(audioType, fileName); }else{ System.out.println("系統暫不支持該類型文件的播放!!!"); } } }
最後看一下效果:
class
/** * 測試類 * @author 櫻桃肉丸子 */ public class AdapterPatternDemo { public static void main(String[] args) { //播放mp4文件 MediaPlayer mediaPlayer = new AudioPlayer(); mediaPlayer.play("mp4","a.mp3"); //播放vlc文件 mediaPlayer.play("vlc","b.vlc"); } }
總結:dva
在這個例子中,mp4和vlc兩個接口本不兼容,可是經過適配器中的靈活調用,使新的播放器同時具備了兩種功能。從功能層面上能夠在AutoPlayer直接將適配器的代碼寫入,但鄙人認爲將這種兼容性的代碼單獨封裝會好一點呢。兼容性