Design Patterns - Adapter Pattern
아답터 패턴은 호환되지 않는 두 인터페이스간 브릿지로써 동작한다. 이 디자인패턴의 형태는 두 독립적 인터페이스의 능력을 묶는 패턴으로써 구조적 패턴에 포함된다.
이 패턴은 독립적 또는 호환되지 않는 인터페이스의 기능들을 묶는 책임이 있는 단일 클래스가 필요하다. 실생활 예는 현금카드와 랩탑사이에서 아답터로써 동작하는 카드리더기의 경우가 될 수 있다. 현금카드를 카드리더에 연결하고 현금카드가 랩탑을 통해 읽혀질 수 있도록 카드리더를 랩탑에 연결한다.
여기서는 오디오 플레이어 기기가 단지 mp3파일만을 플레이할 수 있고 vlc와 mp4파일을 플레이하는 개선된 오디오 플레이어 능력을 사용하기를 원하는 예로 아답터 패턴의 용도를 보여주고 있다.
Implementation
MediaPlayer 인터페이스와 MediaPlayer 인터페이스를 구현하는 구체적인 AudioPlayer 클래스를 가지고 있다. AudioPlayer는 기본적으로 mp3 오디오 포멧을 플레이할 수 있다.
그리고 다른 AdvancedMediaPayer 인터페이스와 AdvancedMediaPlayer 인터페이스를 구현하는 구체적 클래스도 가지고 있다. 이 클래스는 vlc와 mp4 파일 형식을 플레이할 수 있다.
AudioPlayer는 희망하는 포멧을 플레이할 수 있는 실제 클래스를 아는 것 없이 희망하는 오디오 형태를 전달하는 MediaAdapter 아답터 클래스를 사용한다. AdapterpatternDemo, demo 클래스는 다양한 형태를 플레이하기 위한 AudioPlayer를 사용할 것이다.
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