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

Как Observer следит за объектами

2.0 Middle🔥 111 комментариев
#Архитектура и паттерны

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

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

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

Паттерн Observer в разработке под Android

Паттерн Observer (Наблюдатель) — это поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам следить за изменениями состояния других объектов. В контексте Android разработки это один из фундаментальных паттернов, лежащих в основе таких ключевых компонентов, как LiveData, ViewModel и реактивные потоки (RxJava, Coroutines Flow).

Как Observer "следит" за объектами: механизм

В основе паттерна лежит отношение "один-ко-многим" между Subject (Субъект, наблюдаемый объект) и Observer (Наблюдатель). Observer не опрашивает Subject постоянно, а подписывается на него, получая уведомления о изменениях автоматически.

Ключевые этапы слежения:

  1. Регистрация (подписка) Observer регистрирует себя у Subject, добавляясь в его внутренний список подписчиков.

  2. Сохранение ссылки Subject хранит коллекцию ссылок на всех зарегистрированных Observer'ов. Обычно это List или Set.

  3. Уведомление о изменении Когда состояние Subject изменяется, он итерируется по списку подписчиков и вызывает у каждого определённый метод (часто update() или onChanged()), передавая обновлённые данные.

  4. Отмена подписки Observer может отписаться, когда слежение больше не требуется, чтобы избежать утечек памяти.

Реализация на Kotlin: классический пример

// 1. Интерфейс Observer
interface DataObserver {
    fun onDataChanged(newData: String)
}

// 2. Subject (Наблюдаемый объект)
class DataSubject {
    private val observers = mutableListOf<DataObserver>()
    private var data: String = ""

    fun getData(): String = data

    fun setData(newData: String) {
        this.data = newData
        notifyObservers() // Уведомляем всех при изменении!
    }

    // Подписка
    fun subscribe(observer: DataObserver) {
        observers.add(observer)
    }

    // Отписка
    fun unsubscribe(observer: DataObserver) {
        observers.remove(observer)
    }

    // Уведомление всех подписчиков
    private fun notifyObservers() {
        for (observer in observers) {
            observer.onDataChanged(data)
        }
    }
}

// 3. Конкретный Observer
class LoggerObserver : DataObserver {
    override fun onDataChanged(newData: String) {
        println("Данные изменились: $newData")
    }
}

// Использование
fun main() {
    val subject = DataSubject()
    val logger = LoggerObserver()

    subject.subscribe(logger) // Подписываемся
    subject.setData("Hello")   // LoggerObserver получит уведомление
    subject.setData("World")   // Ещё одно уведомление
    subject.unsubscribe(logger)
}

Observer в Android: ключевые применения

  • LiveData: Классическая реализация для UI слоя.
viewModel.liveData.observe(viewLifecycleOwner) { data ->
    // UI автоматически обновляется при изменении data
}
  • RxJava / Coroutines Flow: Реактивные потоки, где Observer (подписчик) следит за эмиттами данных.
  • EventBus / BroadcastReceiver: Системные механизмы широковещательных уведомлений.
  • Слушатели (Listeners): Например, OnClickListener — частный случай Observer.

Критические аспекты для Android-разработчика

  • Управление жизненным циклом: Важнейший аспект! Подписка должна быть привязана к жизненному циклу компонента (Activity/Fragment). Использование LifecycleOwner предотвращает:

    • Утечки памяти (когда Observer переживает Subject или UI компонент).
    • Обновления "мёртвых" UI (когда callback пытается обновить остановленную Activity).
  • Потокобезопасность: Уведомления могут приходить из фоновых потоков. Необходимо использовать postValue() в LiveData или диспетчеры в Coroutines для переключения на Main Thread для UI операций.

  • Избыточные уведомления: Оптимизация через distinctUntilChanged() в RxJava/Flow или Transformations.distinctUntilChanged() в LiveData, чтобы избежать обновлений идентичными данными.

Итог: Observer в Android — это не просто "слежка", а интеллектуальный, жизненный-цикл-осознающий механизм подписки, который обеспечивает реактивность, связывает данные и UI, и при правильной реализации гарантирует стабильность и эффективность приложения. Его понимание — обязательное условие для профессионального Android-разработчика.

Как Observer следит за объектами | PrepBro