Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «У чому суть патерну Observer?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Суть патерну **Observer (Спостерігач)** - **організувати автоматичне сповіщення групи об'єктів (спостерігачів)** про те, що **стан іншого об'єкта (видавця)** змінився, **без жорсткого зв'язку між ними**. **Ключове:** Observer - це "механізм підписки", що робить систему подієвою, гнучкою і реактивною: один повідомляє, решта реагують.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняСуть патерну **Observer (Спостерігач)** - **організувати автоматичне сповіщення групи об'єктів (спостерігачів)** про те, що **стан іншого об'єкта (видавця)** змінився, **без жорсткого зв'язку між ними**. --- ### 1. **Головна ідея** Коли один об'єкт (видавець) змінюється, він **не повідомляє напряму кожного**, хто на нього підписаний, а просто **розсилає сповіщення через спільний механізм**. Підписники (спостерігачі) самі вирішують, **як реагувати** на ці зміни. > Іншими словами: *"Коли щось сталося - усі, кому це цікаво, дізнаються про це автоматично."* --- ### 2. **Ролі в патерні** - **Subject (Видавець)** - об'єкт, який зберігає список підписників і сповіщає їх про зміни. - **Observer (Спостерігач)** - об'єкт, який підписується на події і реагує на їх отримання. - **ConcreteSubject / ConcreteObserver** - конкретні реалізації цих ролей. --- ### 3. **Приклад (Java)** ```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); } } ``` **Використання:** ```java 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 - це "механізм підписки", що робить систему подієвою, гнучкою і реактивною: > *один повідомляє, решта реагують.*Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.