Adapter

Adapter 패턴은 기존 클래스(또는 객체)가 제공하는 인터페이스를 클라이언트가 요구하는 다른 인터페이스로 변환해주는 구조적 디자인 패턴입니다.

   Client


  [Target]


 [Adapter] ────→ [Adaptee]

즉, 기존 클래스의 기능은 그대로 사용하면서도 클라이언트가 기대하는 방식으로 인터페이스를 맞춰주어, 두 시스템 간의 호환성을 높일 수 있습니다.

  • 타겟(Target): 클라이언트가 사용하는 인터페이스입니다.

  • 어댑티(Adaptee): 기존에 존재하는, 원하는 인터페이스와 다른 인터페이스를 가진 클래스입니다.

  • 어댑터(Adapter): 어댑티의 인터페이스를 타겟 인터페이스로 변환하는 클래스입니다.


How do code

// Target 인터페이스: 클라이언트가 사용하고자 하는 인터페이스
public interface MediaPlayer {
    void play(String audioType, String fileName);
}

// Adaptee 클래스: 기존의 인터페이스를 가진 클래스
public class AdvancedMediaPlayer {
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }
    
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}
// Adapter 클래스: Adaptee의 기능을 Target 인터페이스로 변환합니다.
public class MediaAdapter implements MediaPlayer {
    private AdvancedMediaPlayer advancedMediaPlayer;
    
    public MediaAdapter(String audioType) {
        advancedMediaPlayer = new AdvancedMediaPlayer();
    }
    
    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer.playVlc(fileName);
        } else if(audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer.playMp4(fileName);
        }
    }
}
// AudioPlayer는 Target 인터페이스(MediaPlayer)를 구현하여 사용합니다.
public class AudioPlayer implements MediaPlayer {
    private MediaAdapter mediaAdapter;
    
    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: " + fileName);
        } 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.");
        }
    }
}

Last updated