pattern2018. 7. 19. 11:26

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
Posted by easy16