Java Design Pattern - Adaptor Pattern

업데이트:

Design Pattern

  • 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다.
  • 디자인 패턴은 알고리즘이 아니라 상황에 따라 자주 쓰이는 설계 방법을 정리한 코딩 방법론일 뿐이며 모든 상황의 해결책이 아니다.

Structural Patterns, 구조 패턴

  • 클래스와 객체를 더 큰 결과물로 합칠 수 있는 구조로 설계하는 패턴이다.
  • 서로 다른 인터페이스를 지닌 여러 개의 객체를 조합하여 단일 인터페이스를 제공하거나, 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.

Adaptor Pattern

  • 클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴이다.

Example

public enum AudioType {

  MP3, MP4, VLC, AVI;

}
public interface MediaPlayer {

  public void play(AudioType audioType, String fileName);

}
public class AudioPlayer implements MediaPlayer {

  MediaAdaptor mediaAdapter;

  @Override
  public void play(AudioType audioType, String fileName) {
    // Inbuilt support to play mp3 music files.
    switch (audioType) {
      case MP3:
        System.out.println("Playing mp3 file. Name : " + fileName);
        break;
      case VLC:
      case MP4:
        mediaAdapter = new MediaAdaptor(audioType);
        mediaAdapter.play(audioType, fileName);
        break;
      default:
        System.out.println("Invaild media. " + audioType + " format not supported.");
        break;
    }
  }

}
  • MediaPlayer 인터페이스를 상속받은 AudioPlayer 클래스를 구현하여 특정 파일 형식 별 처리가 가능하도록 한다.
public interface AdvancedMediaPlayer {

  public void playVlc(String fileName);

  public void playMp4(String fileName);

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

}
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.
  }

}
  • 테스트를 위해 VlcPlayer와 Mp4Player를 구현한다.
public class MediaAdaptor implements MediaPlayer {

  private AdvancedMediaPlayer advancedMediaPlayer;

  public MediaAdaptor(AudioType audioType) {
    switch (audioType) {
      case VLC:
        advancedMediaPlayer = new VlcPlayer();
        break;
      case MP4:
        advancedMediaPlayer = new Mp4Player();
        break;
      default:
        break;
    }
  }

  @Override
  public void play(AudioType audioType, String fileName) {
    switch (audioType) {
      case VLC:
        advancedMediaPlayer.playVlc(fileName);
        break;
      case MP4:
        advancedMediaPlayer.playMp4(fileName);
        break;
      default:
        break;
    }
  }

}
  • MediaAdaptor 클래스로 주어진 AudioType 별 구현체를 사용하도록 처리한다.
public class AdaptorPatternMain {

  public static void main(String[] args) {
    AudioPlayer audioPlayer = new AudioPlayer();

    audioPlayer.play(AudioType.MP3, "Beyond the horizen.mp3");
    audioPlayer.play(AudioType.MP4, "Alone.mp4");
    audioPlayer.play(AudioType.VLC, "Far far away.vlc");
    audioPlayer.play(AudioType.AVI, "Mind me.avi");
  }

}
  • AudioType 별로 AudioPlayer의 play method를 호출하여 지원 가능한 확장자를 확인해본다.

Source

Sample Code는 여기에서 확인 가능합니다.

댓글남기기