디자인 패턴-어댑터 패턴

어댑터 패턴은 호환되지 않는 두 인터페이스 간의 브리지 역할을합니다. 이 유형의 디자인 패턴은 두 개의 독립적 인 인터페이스의 기능을 결합하기 때문에 구조적 패턴을 따릅니다.

이 패턴은 독립적이거나 호환되지 않는 인터페이스의 기능을 결합하는 단일 클래스를 포함합니다. 실제 사례로는 메모리 카드와 노트북 사이의 어댑터 역할을하는 카드 리더의 경우가 있습니다. 메모리 카드를 카드 리더기에 연결하고 카드 리더를 노트북에 연결하여 메모리 카드를 노트북을 통해 읽을 수 있도록합니다.

오디오 플레이어 장치가 mp3 파일 만 재생할 수 있고 vlc 및 mp4 파일을 재생할 수있는 고급 오디오 플레이어를 사용하려는 다음 예제를 통해 어댑터 패턴 사용을 시연하고 있습니다.

이행

우리는이 MediaPlayer를의 인터페이스와 구체적인 클래스 AudioPlayer 구현하는 MediaPlayer를의 인터페이스를. AudioPlayer 는 기본적으로 mp3 형식의 오디오 파일을 재생할 수 있습니다.

우리는 다른 인터페이스 AdvancedMediaPlayerAdvancedMediaPlayer 인터페이스를 구현하는 구체적인 클래스를 가지고 있습니다. 이러한 클래스는 vlc 및 mp4 형식 파일을 재생할 수 있습니다.

AudioPlayer 가 다른 형식도 재생 하도록 만들고 싶습니다 . 이를 위해 MediaPlayer 인터페이스 를 구현하고 AdvancedMediaPlayer 개체를 사용 하여 필요한 형식을 재생 하는 어댑터 클래스 MediaAdapter 를 만들었습니다 .

AudioPlayer 는 어댑터 클래스 MediaAdapter 를 사용하여 원하는 형식을 재생할 수있는 실제 클래스를 몰라도 원하는 오디오 유형을 전달합니다. AdapterPatternDemo , 데모 클래스는 AudioPlayer 클래스를 사용 하여 다양한 형식을 재생합니다.

1 단계

미디어 플레이어 및 고급 미디어 플레이어 용 인터페이스를 만듭니다.

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 단계

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 단계

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 단계

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 단계

출력을 확인하십시오.

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