Adapter pattern
-호환되지 않는 독립적인 interface간의 bridge로써 동작.
-위 interface를 연결하기 위한 class를 포함한다.
user는 기존의 AudioPlayer에서 adapter를 사용하는지에 대해 알지 못하며,
mp3만 사용하던 기존에 비해서 단지 기능이 추가 된것으로 보임.
Main 호출 부분:
1 2 3 4 5 | 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 두개의 인터페이스에는 사실상 공통점이 없다.
1 2 3 | public interface MediaPlayer { public void play(String audioType, String fileName); } |
1 2 3 4 | public interface AdvancedMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName); } |
따라서 MediaAdapter는 MediaPlayer를 구현하고, AdvancedMediaPlayer 객체를 맴버로서 활용하여 두 인터페이스간의 차이를 극복하도록 사용한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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" ); } } } |
나머지
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 |