개발/디자인패턴

[Design Pattern] Adapter 패턴

도넛의용기 2023. 5. 25. 11:23

어댑터 패턴은 기존의 클래스 인터페이스를 클라이언트가 원하는 다른 인터페이스로 변환하는 패턴입니다.

예를 들어, 이미 만들어져 있는 한 클래스의 메소드를 다른 클래스에서 사용하고 싶을 때 어댑터 패턴을 사용할 수 있습니다.

interface MediaPlayer {
    fun play(audioType: String, fileName: String)
}

interface AdvancedMediaPlayer {
    fun playVlc(fileName: String)
    fun playMp4(fileName: String)
}

class VlcPlayer : AdvancedMediaPlayer {
    override fun playVlc(fileName: String) {
        println("Playing vlc file. Name: $fileName")
    }

    override fun playMp4(fileName: String) {
        // Do nothing
    }
}

class Mp4Player : AdvancedMediaPlayer {
    override fun playVlc(fileName: String) {
        // Do nothing
    }

    override fun playMp4(fileName: String) {
        println("Playing mp4 file. Name: $fileName")
    }
}

class MediaAdapter(audioType: String) : MediaPlayer {
    private val advancedMusicPlayer: AdvancedMediaPlayer

    init {
        when (audioType) {
            "vlc" -> advancedMusicPlayer = VlcPlayer()
            "mp4" -> advancedMusicPlayer = Mp4Player()
            else -> throw IllegalArgumentException("Invalid media type.")
        }
    }

    override fun play(audioType: String, fileName: String) {
        when (audioType) {
            "vlc" -> advancedMusicPlayer.playVlc(fileName)
            "mp4" -> advancedMusicPlayer.playMp4(fileName)
            else -> throw IllegalArgumentException("Invalid media type.")
        }
    }
}

class AudioPlayer : MediaPlayer {
    private val mediaAdapter: MediaAdapter

    override fun play(audioType: String, fileName: String) {
        when (audioType) {
            "mp3" -> println("Playing mp3 file. Name: $fileName")
            "vlc", "mp4" -> {
                mediaAdapter = MediaAdapter(audioType)
                mediaAdapter.play(audioType, fileName)
            }
            else -> throw IllegalArgumentException("Invalid media type.")
        }
    }
}

위 코드에서 MediaPlayer 인터페이스는 오디오 파일을 재생할 수 있는 메소드를 선언합니다. AdvancedMediaPlayer 인터페이스는 MediaPlayer에서 사용되지 않는 더 많은 기능을 가진 메소드를 선언합니다.

VlcPlayer와 Mp4Player 클래스는 AdvancedMediaPlayer를 구현합니다.

MediaAdapter 클래스는 MediaPlayer 인터페이스를 구현하며, AdvancedMediaPlayer를 감싸고 있습니다. 이 클래스는 MediaPlayer 인터페이스의 play() 메소드를 구현합니다. 이 클래스는 audioType에 따라 적절한 AdvancedMediaPlayer 구현체(VlcPlayer 또는 Mp4Player)를 생성합니다.

AudioPlayer 클래스는 MediaPlayer 인터페이스를 구현하며, 오디오 파일을 재생하는 메소드를 구현합니다. 이 클래스는 audioType에 따라 적절한 MediaPlayer 구현체(MediaAdapter)를 생성합니다. 이 클래스는 mp3, vlc, mp4 중 하나의 파일 형식을 재생할 수 있습니다.

이와 같이 어댑터 패턴을 사용하면 기존의 클래스를 수정하지 않고도 새로운 인터페이스를 적용할 수 있습니다.

'개발 > 디자인패턴' 카테고리의 다른 글

[Design Pattern] View Model of MVVM  (1) 2023.07.27
[Design Pattern] Factory 패턴  (0) 2023.05.25
[Design Pattern] Builder 패턴  (6) 2023.05.25
[Design Pattern] MVVM 아키텍처 패턴  (1) 2023.05.22