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

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

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

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

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

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

Пример поведенческого паттерна: Наблюдатель (Observer)

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

Суть паттерна Наблюдатель

В этом паттерне есть два ключевых компонента:

  • Subject (Издатель) — объект, за которым наблюдают. Он хранит список наблюдателей и уведомляет их о своих изменениях.
  • Observer (Наблюдатель) — объект, который подписывается на изменения издателя и реагирует на них.

Этот паттерн широко используется в Android-разработке, например, в механизмах LiveData, RxJava, или для обработки событий UI.

Практический пример на Kotlin

Допустим, у нас есть приложение для отслеживания погоды. Метеостанция (издатель) уведомляет различные устройства (наблюдатели) о изменении температуры.

1. Определяем интерфейс Observer

interface WeatherObserver {
    fun update(temperature: Double)
}

2. Создаём класс Subject (Метеостанция)

class WeatherStation {
    private val observers = mutableListOf<WeatherObserver>()
    private var temperature: Double = 0.0

    fun addObserver(observer: WeatherObserver) {
        observers.add(observer)
    }

    fun removeObserver(observer: WeatherObserver) {
        observers.remove(observer)
    }

    fun setTemperature(temp: Double) {
        this.temperature = temp
        notifyObservers()
    }

    private fun notifyObservers() {
        for (observer in observers) {
            observer.update(temperature)
        }
    }
}

3. Реализуем конкретных наблюдателей

class PhoneDisplay(private val name: String) : WeatherObserver {
    override fun update(temperature: Double) {
        println("$name: Температура обновлена до $temperature°C")
    }
}

class TabletDisplay(private val name: String) : WeatherObserver {
    override fun update(temperature: Double) {
        println("$name: Получены новые данные - $temperature°C")
    }
}

4. Используем паттерн в клиентском коде

fun main() {
    val weatherStation = WeatherStation()
    
    val phone = PhoneDisplay("Смартфон")
    val tablet = TabletDisplay("Планшет")
    
    // Подписываем наблюдателей
    weatherStation.addObserver(phone)
    weatherStation.addObserver(tablet)
    
    // Изменяем температуру -> все наблюдатели уведомляются
    weatherStation.setTemperature(25.5)
    // Вывод:
    // Смартфон: Температура обновлена до 25.5°C
    // Планшет: Получены новые данные - 25.5°C
    
    weatherStation.setTemperature(30.0)
    // Вывод:
    // Смартфон: Температура обновлена до 30.0°C
    // Планшет: Получены новые данные - 30.0°C
    
    // Отписываем один из наблюдателей
    weatherStation.removeObserver(tablet)
    weatherStation.setTemperature(28.0)
    // Вывод:
    // Смартфон: Температура обновлена до 28.0°C
}

Преимущества паттерна Наблюдатель в Android

  • Слабую связанность: Издатель не знает деталей реализации наблюдателей.
  • Гибкость: Можно добавлять новых наблюдателей без изменения кода издателя.
  • Реактивность: Идеально подходит для событийно-ориентированных систем, таких как UI-компоненты.

Аналоги в Android SDK

  • LiveData и Flow в Android Architecture Components реализуют этот паттерн для наблюдения за данными.
  • OnClickListener для обработки кликов по кнопкам.
  • BroadcastReceiver для получения системных событий.

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

Приведи пример поведенческого паттерна | PrepBro