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

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

Призначення

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

Переваги

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

Недоліки

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


Устрій

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

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

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

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

Область застосування

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

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

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

Простими словами

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

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

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

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

Приклади

Java

PHP5

C#

C++

ActionScript

Реалізації

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

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

ActionScript

BASIC

C

  • GObject, у GLib — реалізація об'єктів і сигналів/зворотних викликів (Callback) в 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

  • EventDispatcher singleton, a JavaScript core API based Signals and slots implementation — an observer concept different from Publish/subscribe — pretty lightweighted but still type-safety enforcing.

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.


This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.