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

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

Спостерігач, 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.