Что такое Observer?
Паттерн «Наблюдатель» (Observer) — это поведенческий паттерн проектирования, суть которого в том, что один объект (наблюдаемый) может автоматически уведомлять другие объекты (наблюдатели) о своих изменениях.
Это похоже на подписку: один объект «подписывается» на другой, чтобы быть в курсе изменений. Когда наблюдаемый объект изменяется — все подписчики получают уведомление и могут отреагировать.
Где это полезно?
Этот паттерн часто используется, когда:
▫️у нас есть модель данных, и мы хотим автоматически обновлять UI
▫️нужно разделить логику обработки и отображения данных
▫️необходимо уведомить несколько частей системы об одном событии
Как реализовать Observer?
✔️Создаем абстракцию Observable (или Subject) — объект, за которым наблюдают
✔️Создаем абстракцию Observer — наблюдатель
✔️Реализуем логику хранения списка наблюдателей в Observable
✔️Реализуем метод update в Observer, чтобы обрабатывать изменения
Пример:
abstract class Observer {
void update(int data);
}
class Observable {
final _observers = <Observer>[];
int _value = 0;
void addObserver(Observer observer) => _observers.add(observer);
void removeObserver(Observer observer) => _observers.remove(observer);
set value(int newValue) {
_value = newValue;
_notify();
}
void _notify() {
for (final o in _observers) {
o.update(_value);
}
}
}
class LoggerObserver implements Observer {
@override
void update(int data) => print('Updated value: $data');
}
void main() {
final observable = Observable();
final observer = LoggerObserver();
observable.addObserver(observer);
observable.value = 1;
observable.value = 2;
observable.removeObserver(observer);
}Что тут происходит:
▪️Observer — абстрактный класс с методом update, который вызывается при изменении состояния
▪️Observable — содержит список наблюдателей и уведомляет их при изменении значения переменной value
▪️LoggerObserver — конкретный наблюдатель, который просто печатает обновленное значение
В main() мы добавляем наблюдателя, изменяем значение, и он автоматически получает уведомления. Потом мы его удаляем из списка — и уведомления больше не приходят.
Плюсы:
✅ Слабая связанность — наблюдатель не зависит от внутренней логики наблюдаемого
✅ Гибкость — можно динамически добавлять и удалять наблюдателей
✅ Масштабируемость — несколько объектов могут реагировать на одно событие
Минусы:
⚠️ Перегрузка сообщений — большое количество наблюдателей может вызвать перегрузку
⚠️ Циклические зависимости — если наблюдатель и наблюдаемый зависят друг от друга
⚠️ Порядок уведомлений — не гарантируется порядок вызова update()
А во Flutter?
▫️ChangeNotifier и ChangeNotifierProvider в Provider
▫️ValueNotifier + ValueListenableBuilder
▫️StreamBuilder, который реагирует на события стрима
▫️InheritedWidget и InheritedNotifier — это тоже про наблюдение за изменениями
Какой паттерн разобрать в следующий раз?🔍
