Меню

Главная
Случайная статья
Настройки
Наблюдатель (шаблон проектирования)
Материал из https://ru.wikipedia.org

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

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

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

Содержание

Назначение

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

Реализация



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


Область применения

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


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

Примеры

PHP5 (SPL)
/**
 * В PHP осуществляется встроенная поддержка этого шаблона через входящее в поставку
 * расширение SPL (Standard PHP Library):
 * SplObserver - интерфейс для Observer (наблюдателя),
 * SplSubject - интерфейс Observable (наблюдаемого),
 * SplObjectStorage - вспомогательный класс (обеспечивает улучшенное сохранение и удаление
 * объектов, в частности, реализованы методы attach() и detach()).
 */
class Observable implements SplSubject
{
    private $storage;

    function __construct()
    {
        $this->storage = new SplObjectStorage();
    }

    function attach(SplObserver $observer)
    {
        $this->storage->attach($observer);
    }

    function detach(SplObserver $observer)
    {
        $this->storage->detach($observer);
    }

    function notify()
    {
        foreach($this->storage as $obj)
        {
            $obj->update($this);
        }
    }
}

class ConcreteObserver implements SplObserver
{
    private $observable;
    private $index;

    function __construct(Observable $observable)
    {
        static $sindex=0;

        $this->index=$sindex++;

        $this->observable = $observable;
        $observable->attach($this);
    }

    function update(SplSubject $subject)
    {
        if($subject === $this->observable)
        {
            echo "Send notify to ConcreteObserver [$this->index]\n";
        }
    }

}

$observable = new Observable();

new ConcreteObserver($observable);
new ConcreteObserver($observable);
new ConcreteObserver($observable);

$observable->notify();


PHP5
Downgrade Counter