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

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

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

Зміст

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

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

Устрій [ред.]

Observer.png

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

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

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

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

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

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

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

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

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

Java [ред.]

PHP5 [ред.]

C# [ред.]

C++ [ред.]

ActionScript [ред.]

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

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

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

ActionScript [ред.]

  • flash.events, пакет у ActionScript 3.0 (який наслідував пакет mx.events у ActionScript 2.0).

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