Adapter pattern
-호환되지 않는 독립적인 interface간의 bridge로써 동작.
-위 interface를 연결하기 위한 class를 포함한다.
user는 기존의 AudioPlayer에서 adapter를 사용하는지에 대해 알지 못하며,
mp3만 사용하던 기존에 비해서 단지 기능이 추가 된것으로 보임.
Main 호출 부분:
AudioPlayer mPlayer = new AudioPlayer(); mPlayer.play("mp3","hi mp3"); mPlayer.play("vlc","hi vlc"); mPlayer.play("mp4","hi mp4"); mPlayer.play("avi","hi avi");
MediaPlayer, AdvancedMediaPlayer 두개의 인터페이스에는 사실상 공통점이 없다.
public interface MediaPlayer { public void play(String audioType, String fileName); }
public interface AdvancedMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName); }
따라서 MediaAdapter는 MediaPlayer를 구현하고, AdvancedMediaPlayer 객체를 맴버로서 활용하여 두 인터페이스간의 차이를 극복하도록 사용한다.
class MediaAdapter implements MediaPlayer { AdvancedMediaPlayer advancedMediaPlayer; public MediaAdapter(String audioType) { if (audioType.equalsIgnoreCase("vlc")) advancedMediaPlayer = new VlcPlayer(); else if (audioType.equalsIgnoreCase("mp4")) advancedMediaPlayer = new Mp4Player(); } @Override public void play(String audioType, String fileName) { if(audioType.equalsIgnoreCase("vlc")) advancedMediaPlayer.playVlc(fileName); else if ( audioType.equalsIgnoreCase("mp4")) advancedMediaPlayer.playMp4(fileName); } }
중심이 되는 AudioPlayer에서 MediaAdapter를 추가하고 기존 play메소드에 대한 구현을 변경한다.
AudioPlayer.java
public class AudioPlayer implements MediaPlayer { MediaAdapter mediaAdapter; @Override public void play(String audioType, String fileName) { if ( audioType.equalsIgnoreCase("mp3")) { Log.d("hello", "Playing mp3 name :" + fileName); } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){ mediaAdapter = new MediaAdapter(audioType); mediaAdapter.play(audioType, fileName); }else{ Log.d("hello", "Invalid audio type"+audioType+" is not supported"); } } }
나머지
public class Mp4Player implements AdvancedMediaPlayer { @Override public void playVlc(String fileName) { return; } @Override public void playMp4(String fileName) { Log.d("hello", "Playing mp4 Name :"+fileName); } } public class VlcPlayer implements AdvancedMediaPlayer { @Override public void playVlc(String fileName) { Log.d("hello", "Playing vlc name :"+fileName); } @Override public void playMp4(String fileName) { return; } }
결과 :
07-19 11:14:08.891 7070 7070 D hello : Playing mp3 name :hi mp3
07-19 11:14:08.892 7070 7070 D hello : Playing vlc name :hi vlc
07-19 11:14:08.893 7070 7070 D hello : Playing mp4 Name :hi mp4
07-19 11:14:08.893 7070 7070 D hello : Invalid audio typeavi is not supported
출처 :
'pattern' 카테고리의 다른 글
Filter pattern or Criteria pattern (0) | 2018.07.19 |
---|---|
Bridge pattern (0) | 2018.07.19 |
Prototype pattern (0) | 2018.07.18 |
Builder pattern (0) | 2018.07.18 |
Singleton pattern (0) | 2018.07.18 |