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는 여기에서 확인 가능합니다.
댓글남기기