Приведи пример структурного паттерна

«Приведи пример структурного паттерна» — вопрос из категории Паттерны, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Adapter – структурный паттерн, позволяющий несовместимым интерфейсам работать вместе.

Пример:

// Интерфейс, который ожидает клиент
interface MediaPlayer {
    fun play(audioType: String, fileName: String)
}

// Адаптируемый класс с другим интерфейсом
class AdvancedMediaPlayer {
    fun playVlc(fileName: String) = println("Playing VLC: $fileName")
    fun playMp4(fileName: String) = println("Playing MP4: $fileName")
}

// Адаптер
class MediaAdapter(private val advancedPlayer: AdvancedMediaPlayer) : MediaPlayer {
    override fun play(audioType: String, fileName: String) {
        when (audioType.lowercase()) {
            "vlc" -> advancedPlayer.playVlc(fileName)
            "mp4" -> advancedPlayer.playMp4(fileName)
            else -> throw UnsupportedOperationException("Unsupported format: $audioType")
        }
    }
}

// Использование
val player: MediaPlayer = MediaAdapter(AdvancedMediaPlayer())
player.play("mp4", "movie.mp4") // Playing MP4: movie.mp4

Суть: Адаптер преобразует вызовы одного интерфейса в другой, сохраняя функциональность.