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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

Призначення[ред. | ред. код]

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

Переваги[ред. | ред. код]

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

Недоліки[ред. | ред. код]

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


Устрій[ред. | ред. код]

Observer.png

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

  • Observable — інтерфейс, що визначає методи для додавання, видалення та оповіщення спостерігачів.
  • Observer — інтерфейс, за допомогою якого спостережуваний об'єкт оповіщає спостерігачів.
  • ConcreteObservable — конкретний клас, який реалізує інтерфейс Observable.
  • 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 — 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.