어댑터 패턴은 기존의 클래스 인터페이스를 클라이언트가 원하는 다른 인터페이스로 변환하는 패턴입니다.
예를 들어, 이미 만들어져 있는 한 클래스의 메소드를 다른 클래스에서 사용하고 싶을 때 어댑터 패턴을 사용할 수 있습니다.
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 |