У чому суть патерну Observer?
Суть патерну Observer (Спостерігач) - організувати автоматичне сповіщення групи об'єктів (спостерігачів) про те, що стан іншого об'єкта (видавця) змінився, без жорсткого зв'язку між ними.
1. Головна ідея
Коли один об'єкт (видавець) змінюється, він не повідомляє напряму кожного, хто на нього підписаний, а просто розсилає сповіщення через спільний механізм.
Підписники (спостерігачі) самі вирішують, як реагувати на ці зміни.
Іншими словами: "Коли щось сталося - усі, кому це цікаво, дізнаються про це автоматично."
2. Ролі в патерні
- Subject (Видавець) - об'єкт, який зберігає список підписників і сповіщає їх про зміни.
- Observer (Спостерігач) - об'єкт, який підписується на події і реагує на їх отримання.
- ConcreteSubject / ConcreteObserver - конкретні реалізації цих ролей.
3. Приклад (Java)
// Інтерфейс спостерігача
interface Observer {
void update(String event);
}
// Видавець
class NewsAgency {
private List<Observer> observers = new ArrayList<>();
public void subscribe(Observer o) { observers.add(o); }
public void unsubscribe(Observer o) { observers.remove(o); }
public void notifyObservers(String news) {
for (Observer o : observers) o.update(news);
}
}
// Конкретні спостерігачі
class NewsChannel implements Observer {
private String name;
public NewsChannel(String name) { this.name = name; }
public void update(String news) {
System.out.println(name + " отримав новину: " + news);
}
}Використання:
NewsAgency agency = new NewsAgency();
Observer cnn = new NewsChannel("CNN");
Observer bbc = new NewsChannel("BBC");
agency.subscribe(cnn);
agency.subscribe(bbc);
agency.notifyObservers("Новий випуск новин!");4. Переваги
- Послаблена зв'язаність між видавцем і підписниками. Видавець не знає, хто саме його слухає - лише те, що вони реалізують спільний інтерфейс.
- Гнучкість - можна додавати, прибирати і змінювати підписників під час роботи.
- Легко розширювати систему подій (нові типи сповіщень, нові реакції).
5. Недоліки
- Можливий лавиноподібний потік сповіщень, якщо підписників багато.
- Складніше відстежити джерело змін - події відбуваються "неявно".
Висновок
Патерн Observer потрібен, коли одна зміна повинна автоматично викликати реакцію в інших частинах системи, але без прямої залежності між ними.
Підсумок:
Observer - це "механізм підписки", що робить систему подієвою, гнучкою і реактивною: один повідомляє, решта реагують.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.