반응형

Design Patterns - Adapter Pattern


(원문 위치 : http://www.tutorialspoint.com/design_pattern/adapter_pattern.htm )


아답터 패턴은 호환되지 않는 두 인터페이스간 브릿지로써 동작한다. 이 디자인패턴의 형태는 두 독립적 인터페이스의 능력을 묶는 패턴으로써 구조적 패턴에 포함된다.


이 패턴은 독립적 또는 호환되지 않는 인터페이스의 기능들을 묶는 책임이 있는 단일 클래스가 필요하다. 실생활 예는 현금카드와 랩탑사이에서 아답터로써 동작하는 카드리더기의 경우가 될 수 있다. 현금카드를 카드리더에 연결하고 현금카드가 랩탑을 통해 읽혀질 수 있도록 카드리더를 랩탑에 연결한다.


여기서는 오디오 플레이어 기기가 단지 mp3파일만을 플레이할 수 있고 vlc와 mp4파일을 플레이하는 개선된 오디오 플레이어 능력을 사용하기를 원하는 예로 아답터 패턴의 용도를 보여주고 있다.

Implementation

MediaPlayer 인터페이스와 MediaPlayer 인터페이스를 구현하는 구체적인 AudioPlayer 클래스를 가지고 있다. AudioPlayer는 기본적으로 mp3 오디오 포멧을 플레이할 수 있다.

그리고 다른 AdvancedMediaPayer 인터페이스와 AdvancedMediaPlayer 인터페이스를 구현하는 구체적 클래스도 가지고 있다. 이 클래스는 vlc와 mp4 파일 형식을 플레이할 수 있다.

AudioPlayer는 희망하는 포멧을 플레이할 수 있는 실제 클래스를 아는 것 없이 희망하는 오디오 형태를 전달하는 MediaAdapter 아답터 클래스를 사용한다. AdapterpatternDemo, demo 클래스는 다양한 형태를 플레이하기 위한 AudioPlayer를 사용할 것이다.

Adapter Pattern UML Diagram

Step 1

Media Player와 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);
}

Step 2

AdvancedMediaPalyer 인터페이스를 구현하는 구체적인 클래스를 생성한다.

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

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

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

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

Step 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


반응형

+ Recent posts