Наблюдатель (шаблон проектирования)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Наблюдатель
Observer
Observer UML small
Тип поведенческий
Назначение
  • Шаблон Observer определяет зависимость "один-ко-многим" между объектами так, что при изменении состояния одного объекта все зависящие от него объекты уведомляются и обновляются автоматически;
  • Паттерн Observer инкапсулирует главный (независимый) компонент в абстракцию Subject и изменяемые (зависимые) компоненты в иерархию Observer;
  • Шаблон Observer определяет часть "View" в модели Model-View-Controller (MVC)[1].
Описан в Design Patterns Да

Наблюдатель (англ. Observer) — поведенческий шаблон проектирования. Также известен как «подчинённые» (англ. Dependents). Реализует у класса механизм, который позволяет объекту этого класса получать оповещения об изменении состояния других объектов и тем самым наблюдать за ними[2].

Классы, на события которых другие классы подписываются, называются субъектами (Subjects), а подписывающиеся классы называются наблюдателями (англ. Observers)[3].

Похожие шаблоны: «издатель — подписчик», «посредник», «одиночка».

Назначение[править | править код]

Определяет зависимость типа один ко многим между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.

Реализация[править | править код]

Observer UML

При реализации шаблона «наблюдатель» обычно используются следующие классы:

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

Область применения[править | править код]

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

  • существует как минимум один объект, рассылающий сообщения;
  • имеется не менее одного получателя сообщений, причём их количество и состав могут изменяться во время работы приложения;
  • позволяет избежать сильного зацепления взаимодействующих классов.

Данный шаблон часто применяют в ситуациях, в которых отправителя сообщений не интересует, что делают получатели с предоставленной им информацией.

Примеры[править | править код]

PHP5 (SPL)[править | править код]

PHP5[править | править код]

C#[править | править код]

Java[править | править код]

C++[править | править код]

ActionScript[править | править код]

VB.NET[править | править код]

Python[править | править код]

Object Pascal[править | править код]

Ruby[править | править код]

Rust[править | править код]

Io

JavaScript ES6[править | править код]

Дополнительная информация[править | править код]

В платформе .NET Framework 4.0 шаблон разработки наблюдателя применяется путём реализации универсальных интерфейсов System.IObservable<T> и System.IObserver<T>[2].

Литература[править | править код]

  • Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес. Приемы объектно-ориентированного проектирования. Паттерны проектирования = Design Patterns. Elements of Reusable Object-Oriented Software. — СПб.: Питер, 2009. — 366 с. — ISBN 978-5-469-01136-1.
  • Эрик Фримен, Элизабет Фримен. Паттерны проектирования = Head First Design Patterns. — СПб.: Питер, 2011. — 656 с. — ISBN 978-5-459-00435-9.

Примечания[править | править код]

  1. Паттерн Observer. Дата обращения: 13 июня 2013. Архивировано 13 июня 2013 года.
  2. 1 2 Шаблон разработки Observer. Дата обращения: 13 июня 2013. Архивировано 13 июня 2013 года.
  3. Паттерн наблюдатель (Observer). Дата обращения: 4 ноября 2019. Архивировано 4 ноября 2019 года.