Design Patterns - Adapter Pattern(譯)

原文連接
譯者:smallclover
我的翻譯,水平有限,若有錯誤歡迎指出,謝謝!java

設計模式-適配器模式

適配器模式做爲橋樑,鏈接兩個不兼容的接口。這種類型的設計模式來源於結構型模式,它具備結合兩個相互獨立的接口的能力。設計模式

這個模式涉及到單個類,該類負責接入獨立的、不兼容的接口。一個現實生活的例子,好比說讀卡器,它可能會在記憶卡和筆記本電腦之間扮演一個適配者的角色。首先把記憶卡插到讀卡器上,在把讀卡器插入筆記本上,而後咱們就能夠從筆記本讀取記憶卡上的數據。
咱們經過如下的例子來展現適配器模式。一個音頻播放器設備只能播放mp3文件;而另外一個比較先進的音樂播放器能夠播放vlc和mp4文件。ide

clipboard.png

實現

咱們有一個MediaPlayer接口和一個實現該接口的實體類AudioPlayer,這個AudioPlayer默認播放mp3格式的音頻。spa

咱們還有另一個接口 AdvancedMediaPalyer 和實現該接口的實體類
這些實體類能夠播放vlcmp4格式的音頻。翻譯

咱們但願AudioPlayer也能夠播放其餘格式的文件。爲了實現這個目標,咱們建立了一個適配器類MediaAdapter,該類實現了接口MediaPlayer,而且使用AdvancedMediaPlayer的對象來播放須要的格式。設計

AudioPlayer 使用適配器類 MediaAdapter,經過它來播放所指望的音頻類型,不須要知道實際是哪一個類播放這個指望的音頻類型。AdapterPatternDemo,咱們的demo類將使用AudioPlayer類來播放各類格式的音頻。code

第一步

建立MediaPlayerAdvancedMediaPlayer接口。
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
相關文章
相關標籤/搜索