Design Pattern/구조 패턴

Adapter pattern

한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다.

어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.

 

 

Mp3 지원하는 AudioPlater에서 Mp4와 Vlc를 지원하는 AdvancedMediaPlayer를 어댑터 패턴을 통해서 사용하는 것으로

AudioPlater의 play 메서드 실행시 Vlc, Mp4의 따라서 AdvancedMediaPlayer의 playVlc, playMp4 메서드가 실행되도록 하는 것이다.

AdvancedMediaPlayer 모듈

public interface MediaPlayer {
   public void play(String audioType, String fileName);
}
public interface AdvancedMediaPlayer {	
   public void playVlc(String fileName);
   public void playMp4(String fileName);
}
public class VlcPlayer implements AdvancedMediaPlayer{
    @Override
    public void playVlc(String fileName) {
        System.out.println("vic file 실행");
    }

    @Override
    public void playMp4(String fileName) {
        // do nothing
    }
}
public class Mp4Player implements AdvancedMediaPlayer{
    @Override
    public void playVlc(String fileName) {
        // do nothing
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("mp4 file 실행");
    }
}

 

어댑터 이전 MediaPlayer 모듈

public interface MediaPlayer {
    public void play(String audioType, String fileName);
}
public class AudioPlayer implements MediaPlayer {

    @Override
    public void play(String audioType, String fileName) {

        //inbuilt support to play mp3 music files
        if(audioType.equalsIgnoreCase("mp3")){
            System.out.println("vic file 실행");
        }
        else{
            System.out.println("지원하지않는 포멧");
        }
    }
}

 

어댑터

1. AdvancedMediaPlayer를 멤버 변수로 두고 audioType에 따라서 생성 적절한 player로 초기화한다.

2. MediaPlayer의 player를 상속받아서 AdvancedMediaPlayer에 맞게 구현한다.

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);
        }
    }
}

 

어댑터 이후

MediaAdapter를 맴버 변수로 두고 audioType에 따른 if에 조건을 추가하여 실행 되도록 수정

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("mp3 file 실행");
        }

        //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("지원하지않는 포멧");
        }
    }
}

 

실행 데모 및 결과

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");
    }
}

'Design Pattern > 구조 패턴' 카테고리의 다른 글

Proxy pattern  (0) 2021.05.04
Facade Pattern  (0) 2021.05.04
Decorator Pattern  (0) 2021.05.04
Composite Pattern  (0) 2021.05.04
Bridge Pattern  (0) 2021.05.04