Спостерігач (шаблон проєктування)

Спостерігач, Observer — поведінковий шаблон проєктування. Також відомий як «підлеглі» (Dependents), «видавець-передплатник» (Publisher-Subscriber).

Призначення ред.

Визначає залежність типу «один до багатьох» між об'єктами таким чином, що при зміні стану одного об'єкта всіх залежних від нього сповіщають про цю подію.

Переваги ред.

  • Він підтримує принцип вільного зв'язку між об'єктами, які взаємодіють один з одним
  • Дозволяє ефективно передавати дані іншим об'єктам, без будь-яких змін у класах Subject або Observer
  • Спостерігачі можуть бути додані / видалені в будь-який момент часу

Недоліки ред.

  • Інтерфейс Observer повинен бути впроваджений ConcreteObserver, який передбачає успадкування. Композиції для композиції немає, оскільки інтерфейс Observer може бути екземплятором.
  • Якщо це неправильно реалізовано, спостерігач може додати складність і призвести до ненавмисних проблем із продуктивністю.
  • У програмному застосуванні повідомлення іноді можуть бути невибагливими і призвести до умов перегонів або непослідовності.


Устрій ред.

 

При реалізації шаблону «спостерігач» зазвичай використовуються такі класи:

  • Subject — інтерфейс, що визначає методи для додавання, видалення та оповіщення спостерігачів.
  • Observer — інтерфейс, за допомогою якого спостережуваний об'єкт оповіщає спостерігачів.
  • ConcreteSubject — конкретний клас, який реалізує інтерфейс Subject.
  • ConcreteObserver — конкретний клас, який реалізує інтерфейс Observer.

При зміні спостережуваного об'єкту, оповіщення спостерігачів може бути реалізоване за такими сценаріями:

  • Спостережуваний об'єкт надсилає, кожному із зареєстрованих спостерігачів, всю потенційно релевантну інформацію (примусове розповсюдження).
  • Спостережуваний об'єкт надсилає, кожному із зареєстрованих спостерігачів, лише повідомлення про те що інформація була змінена, а кожен із спостерігачів, за необхідності, самостійно здійснює запит необхідної інформації у спостережуваного об'єкта (розповсюдження за запитом).

Область застосування ред.

Шаблон «спостерігач» застосовується в тих випадках, коли система володіє такими властивостями:

  • існує, як мінімум, один об'єкт, що розсилає повідомлення
  • є не менше одного одержувача повідомлень, причому їхня кількість і склад можуть змінюватися під час роботи програми.

Цей шаблон часто застосовують в ситуаціях, в яких відправника повідомлень не цікавить, що роблять одержувачі з наданою їм інформацією.

Простими словами ред.

Об'єкт володіє важливими даними і на нього підписані спостерігачі. Кожен спостерігач має можливість обновити ці дані а інші спостерігачі повинні отримати про це сповіщення і обновитись в слід якщо це необхідно.

Спостерігач не повинен запитувати об'єкт з певною періодичністю, він завжди знає що його дані актуальні.

Зв'язок із іншими патернами ред.

  • Посередник створює двосторонній зв'язок, часто незмінний. Забирає залежності між компонентами системи. Компоненти стають залежними від посередника. Спостерігач створює односторонній зв'язок, який може мінятись під час виконання програми. Таким чином одні об'єкти залежать від інших.

Приклади ред.

Java ред.

PHP5 ред.

C# ред.

C++ ред.

ActionScript ред.

Реалізації ред.

Шаблон Спостерігач реалізований в численних бібліотеках і системах, включаючи майже всі інструментарії графічних інтерфейсів користувача.

Деякі з найпомітніших реалізацій шаблону перелічені нижче:

ActionScript ред.

BASIC ред.

C ред.

C++ ред.

C# ред.

Delphi ред.

Java ред.

JavaScript ред.

Lisp ред.

PHP ред.

Python ред.

Ruby ред.

Інше ред.

Посилання ред.

Джерела ред.

Література ред.

Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.