鍍金池/ 教程/ Java/ Java適配器模式
Java前端控制器模式
Java工廠設(shè)計(jì)模式
Java抽象工廠模式
Java觀察者模式
Java門面模式(或外觀模式)
Java備忘錄模式
Java MVC模式
Java單例模式
Java傳輸對(duì)象模式
Java迭代器模式
Java責(zé)任鏈模式
Java命令模式
Java原型模式
Java解釋器模式
Java適配器模式
Java狀態(tài)模式
Java中介者模式(Mediator Pattern)
Java攔截過(guò)濾器模式
Java策略模式
Java組合模式
Java業(yè)務(wù)代理模式
Java裝飾模式
Java模板模式
Java橋接模式
Java過(guò)濾器模式(條件模式)
Java享元模式(Flyweight Pattern)
Java建造者(Builder)模式
Java設(shè)計(jì)模式
Java空對(duì)象模式
Java數(shù)據(jù)訪問(wèn)對(duì)象模式
Java訪問(wèn)者模式
Java組合實(shí)體模式
Java服務(wù)定位器模式

Java適配器模式

適配器模式作為兩個(gè)不兼容接口之間的橋梁。 這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)模式,因?yàn)樵撃J浇M合了兩個(gè)獨(dú)立接口。

這種模式涉及一個(gè)單獨(dú)的類,它負(fù)責(zé)連接獨(dú)立或不兼容接口的功能。 現(xiàn)實(shí)生活的例子- 讀卡器的,其用作為存儲(chǔ)卡和筆記本電腦之間的適配器。將存儲(chǔ)卡插入讀卡器并將讀卡器插入筆記本電腦接口,以便可以通過(guò)筆記本電腦讀取存儲(chǔ)卡。

我們通過(guò)以下示例演示適配器模式的使用。音頻播放器設(shè)備只能播放mp3文件,但希望能夠?qū)崿F(xiàn)一個(gè)可播放vlcmp4文件的高級(jí)音頻播放器。

實(shí)現(xiàn)實(shí)例

有一個(gè)MediaPlayer接口和一個(gè)具體的類-AudioPlayer它實(shí)現(xiàn)了MediaPlayer接口。 默認(rèn)情況下,音頻播放器(AudioPlayer )可以播放mp3格式的音頻文件。

還有另一個(gè)接口AdvancedMediaPlayer 和實(shí)現(xiàn)AdvancedMediaPlayer 接口的具體類。 這些類可以播放vlcmp4格式的文件。

想讓AudioPlayer播放其他格式。要實(shí)現(xiàn)這一點(diǎn),需要?jiǎng)?chuàng)建了一個(gè)適配器類MediaAdapter,它實(shí)現(xiàn)了MediaPlayer接口并使用AdvancedMediaPlayer對(duì)象來(lái)播放所需的格式。

AudioPlayer使用適配器類MediaAdapter傳遞它所需的音頻類型,而不知道可以播放所需格式的實(shí)際類。 AdapterPatternDemo這是一個(gè)演示類,它將使用AudioPlayer類來(lái)播放各種格式。

實(shí)現(xiàn)結(jié)構(gòu)如下圖所示 -

第1步

分別創(chuàng)建媒體播放器和高級(jí)媒體播放器接口。代碼如下所示 -

MediaPlayer.java

public interface MediaPlayer {
   public void play(String audioType, String fileName);
}

AdvancedMediaPlayer.java

public interface AdvancedMediaPlayer {    
   public void playVlc(String fileName);
   public void playMp4(String fileName);
}

第2步

創(chuàng)建實(shí)現(xiàn)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) {
      //do nothing
   }
}

Mp4Player.java

public class Mp4Player implements AdvancedMediaPlayer{

   @Override
   public void playVlc(String fileName) {
      //do nothing
   }

   @Override
   public void playMp4(String fileName) {
      System.out.println("Playing mp4 file. Name: "+ fileName);        
   }
}

第3步

創(chuàng)建實(shí)現(xiàn)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);
      }
   }
}

第4步

創(chuàng)建一個(gè)實(shí)現(xiàn)MediaPlayer接口的具體類。

AudioPlayer.java

public class AudioPlayer implements MediaPlayer {
   MediaAdapter mediaAdapter; 

   @Override
   public void play(String audioType, String fileName) {        

      //inbuilt support to play mp3 music files
      if(audioType.equalsIgnoreCase("mp3")){
         System.out.println("Playing mp3 file. Name: " + fileName);            
      } 

      //mediaAdapter is providing support to play other file formats
      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");
      }
   }   
}

第5步

使用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");
   }
}

第6步

驗(yàn)證輸出結(jié)果,執(zhí)行上面的代碼得到以下結(jié)果 -

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

上一篇:Java MVC模式下一篇:Java橋接模式