← Назад к вопросам

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

1.3 Junior🔥 21 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример структурного паттерна: Адаптер (Adapter)

Адаптер — это один из наиболее часто используемых структурных паттернов проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе. Он действует как «переходник» между двумя классами, преобразуя интерфейс одного класса в интерфейс, ожидаемый другим. Это особенно полезно при интеграции старого кода в новую систему или использовании сторонних библиотек.

Реальная аналогия

Представьте, что у вас есть зарядное устройство для телефона с разъёмом USB-C, а в стене — розетка евростандарта. Для подключения вам понадобится адаптер, который преобразует один тип разъёма в другой. В программировании Adapter решает аналогичную задачу.

Пример на Kotlin для Android

Допустим, у нас есть старый класс OldPrinter, который печатает текст в консоль, но его метод printText() несовместим с новым интерфейсом NewPrinter, требующим метод print(). Мы создадим адаптер, чтобы использовать старый класс в новой системе.

Шаг 1: Целевой интерфейс (ожидаемый новой системой)

// Интерфейс, который ожидает наша современная система
interface NewPrinter {
    fun print(message: String)
}

Шаг 2: Адаптируемый класс (старый, несовместимый)

// Старый класс с несовместимым интерфейсом
class OldPrinter {
    fun printText(text: String) {
        println("Старый принтер печатает: $text")
    }
}

Шаг 3: Адаптер (преобразует OldPrinter в NewPrinter)

// Адаптер реализует целевой интерфейс и содержит экземпляр старого класса
class PrinterAdapter(private val oldPrinter: OldPrinter) : NewPrinter {
    override fun print(message: String) {
        // Преобразуем вызов нового метода в старый
        oldPrinter.printText("Адаптировано: $message")
    }
}

Шаг 4: Использование в Android-приложении

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // Старый объект, который нужно адаптировать
        val oldPrinter = OldPrinter()
        
        // Создаём адаптер, передавая старый объект
        val adapter: NewPrinter = PrinterAdapter(oldPrinter)
        
        // Теперь можно использовать старый принтер через новый интерфейс
        adapter.print("Привет, мир!")
        // Вывод: "Старый принтер печатает: Адаптировано: Привет, мир!"
    }
}

Преимущества паттерна Адаптер в Android

  • Совместимость: Позволяет интегрировать устаревший код без его изменения.
  • Гибкость: Отделяет клиентский код от конкретных классов, работая через общий интерфейс.
  • Принцип открытости/закрытости: Можно добавлять новые адаптеры, не изменяя существующий код.

Типичные случаи применения в Android

  1. Адаптеры для RecyclerView: Класс RecyclerView.Adapter преобразует данные в элементы списка.
  2. Работа с разными API: Например, адаптер для преобразования данных из REST API в модель приложения.
  3. Использование библиотек: Когда сторонняя библиотека имеет несовместимый интерфейс.
  4. Миграция кода: Постепенная замена старой системы на новую.

Вариации паттерна

  • Адаптер объекта (композиция): Использует композицию, как в примере выше, где адаптер содержит экземпляр старого класса.
  • Адаптер класса (наследование): Наследует старый класс и реализует новый интерфейс (менее гибкий из-за множественного наследования, в Kotlin возможен через интерфейсы).

Адаптер — фундаментальный паттерн, который помогает поддерживать чистую архитектуру, обеспечивая совместимость компонентов без дублирования кода. В Android он особенно важен из-за частых обновлений API и необходимости интеграции разнородных библиотек.