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

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

ПризначенняРедагувати

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

ПеревагиРедагувати

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

НедолікиРедагувати

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


УстрійРедагувати

 

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

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

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

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

Область застосуванняРедагувати

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

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

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

Простими словамиРедагувати

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

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

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

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

ПрикладиРедагувати

JavaРедагувати

PHP5Редагувати

C#Редагувати

C++Редагувати

ActionScriptРедагувати

РеалізаціїРедагувати

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

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

ActionScriptРедагувати

BASICРедагувати

CРедагувати

C++Редагувати

  • libsigc++ — бібліотека сигнальних шаблонів
  • sigslot — C++ Signal/Slot Library
  • Cpp::Events — Template-based C++ implementation that introduces separation of connection management interface of the event object from the invocation interface.
  • XLObject[недоступне посилання з листопадаа 2019] — Template-based C++ signal/slot model patterned after Qt.
  • Signals — A lightweight and non-intrusive C++ signal/slot model implementation.
  • libevent — Multi-threaded Crossplatform Signal/Slot C++ Library
  • Boost.Signals, an extension of the C++ STL providing a signal/slot model
  • The Qt C++ framework's signal/slot model

C#Редагувати

DelphiРедагувати

JavaРедагувати

JavaScriptРедагувати

LispРедагувати

  • Cells, a dataflow extension to Common Lisp that uses meta-programming to hide some of the details of Observer pattern implementation.

PHPРедагувати

PythonРедагувати

RubyРедагувати

ІншеРедагувати

  • CSP — Observer Pattern using CSP-like Rendezvous (each actor is a process, communication is via rendezvous).
  • YUI Event utility implements custom events through the observer pattern
  • Publish/Subscribe with LabVIEW, Implementation example of Observer or Publish/Subscribe using G.

ПосиланняРедагувати

ДжерелаРедагувати

ЛітератураРедагувати

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