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

Что такое паттерн наблюдатель?

2.0 Middle🔥 241 комментариев
#SOLID и паттерны проектирования

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

Паттерн наблюдатель (Observer Pattern)

Паттерн наблюдатель — это поведенческий паттерн проектирования, который определяет зависимость один-ко-многим между объектами таким образом, что при изменении состояния одного объекта все зависящие от него объекты уведомляются об этом автоматически.

Назначение и применение

Основная идея заключается в том, что один объект (издатель, Subject или Observable) уведомляет множество других объектов (наблюдатели, Observers) об изменениях своего состояния. Это позволяет обеспечить слабую связанность между компонентами системы.

Паттерн применяется когда:

  • Изменение одного объекта требует изменения других, но заранее неизвестно сколько их будет
  • Объект должен уведомлять другие, не делая предположений об этих объектах
  • Требуется реализовать механизм оповещения множественных подписчиков

Структура паттерна

Основные компоненты:

  • Subject (издатель) — объект, за которым наблюдают
  • Observer (наблюдатель) — интерфейс для получения уведомлений
  • ConcreteSubject — конкретная реализация издателя
  • ConcreteObserver — конкретная реализация наблюдателя

Пример реализации

// Интерфейс для наблюдателей
public interface Observer {
    void update(String message);
}

// Издатель
public class WeatherStation {
    private List<Observer> observers = new ArrayList<>();
    private String weatherData;
    
    public void subscribe(Observer observer) {
        observers.add(observer);
    }
    
    public void unsubscribe(Observer observer) {
        observers.remove(observer);
    }
    
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(weatherData);
        }
    }
    
    public void setWeather(String data) {
        this.weatherData = data;
        notifyObservers();
    }
}

// Конкретные наблюдатели
public class DisplayA implements Observer {
    @Override
    public void update(String message) {
        System.out.println("Display A shows: " + message);
    }
}

public class DisplayB implements Observer {
    @Override
    public void update(String message) {
        System.out.println("Display B shows: " + message);
    }
}

// Использование
WeatherStation station = new WeatherStation();
Observer display1 = new DisplayA();
Observer display2 = new DisplayB();

station.subscribe(display1);
station.subscribe(display2);

station.setWeather("Sunny and warm");
// Вывод:
// Display A shows: Sunny and warm
// Display B shows: Sunny and warm

Java встроенная реализация

В Java есть встроенный класс java.util.Observable и интерфейс java.util.Observer, но они помечены как deprecated с Java 9, рекомендуется использовать компоненты реактивного программирования (RxJava, Project Reactor) или собственную реализацию.

// Пример с встроенными классами Java (deprecated)
import java.util.Observable;
import java.util.Observer;

public class WeatherStation extends Observable {
    private String weather;
    
    public void setWeather(String data) {
        this.weather = data;
        setChanged();
        notifyObservers(weather);
    }
}

public class DisplayObserver implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Weather: " + arg);
    }
}

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

Преимущества:

  • Слабая связанность между издателем и подписчиками
  • Поддерживает принцип открытости-закрытости (Open-Closed Principle)
  • Динамическая установка и удаление подписок во время выполнения
  • Издатель не нужно изменять при добавлении новых наблюдателей

Недостатки:

  • Наблюдатели уведомляются без определённого порядка
  • Если наблюдатель забыли отписать, может произойти утечка памяти
  • Сложность отладки при большом количестве наблюдателей

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

Паттерн широко используется в:

  • GUI фреймворках (слушатели событий)
  • Event-driven архитектуре
  • Реактивном программировании
  • MVC и MVVM паттернах
  • Spring фреймворке (ApplicationListener)
  • Потоках обработки данных (Stream API)