Modelli di design - Modello adattatore

Il modello dell'adattatore funziona come un ponte tra due interfacce incompatibili. Questo tipo di modello di progettazione rientra nel modello strutturale poiché questo modello combina la capacità di due interfacce indipendenti.

Questo modello coinvolge una singola classe che è responsabile di unire funzionalità di interfacce indipendenti o incompatibili. Un esempio di vita reale potrebbe essere un caso di lettore di schede che funge da adattatore tra la scheda di memoria e un laptop. Si collega la scheda di memoria al lettore di schede e il lettore di schede al laptop in modo che la scheda di memoria possa essere letta tramite il laptop.

Stiamo dimostrando l'uso del pattern Adapter tramite il seguente esempio in cui un dispositivo lettore audio può riprodurre solo file mp3 e desidera utilizzare un lettore audio avanzato in grado di riprodurre file vlc e mp4.

Implementazione

Abbiamo un'interfaccia MediaPlayer e una classe concreta AudioPlayer che implementa l' interfaccia MediaPlayer . AudioPlayer può riprodurre file audio in formato mp3 per impostazione predefinita.

Abbiamo un'altra interfaccia AdvancedMediaPlayer e classi concrete che implementano l' interfaccia AdvancedMediaPlayer . Queste classi possono riprodurre file in formato vlc e mp4.

Vogliamo fare in modo che AudioPlayer riproduca anche altri formati. Per ottenere ciò, abbiamo creato una classe adattatore MediaAdapter che implementa l' interfaccia MediaPlayer e utilizza oggetti AdvancedMediaPlayer per riprodurre il formato richiesto.

AudioPlayer utilizza la classe dell'adattatore MediaAdapter passandogli il tipo di audio desiderato senza conoscere la classe effettiva che può riprodurre il formato desiderato. AdapterPatternDemo , la nostra classe demo utilizzerà la classe AudioPlayer per riprodurre vari formati.

Passo 1

Crea interfacce per Media Player e Advanced Media Player.

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);
}

Passo 2

Crea classi concrete che implementano l' interfaccia 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);		
   }
}

Passaggio 3

Crea una classe adattatore che implementa l' interfaccia 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);
      }
   }
}

Passaggio 4

Crea una classe concreta che implementa l' interfaccia 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");
      }
   }   
}

Passaggio 5

Utilizza AudioPlayer per riprodurre diversi tipi di formati audio.

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

Passaggio 6

Verifica l'output.

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