Предисловие
Знание-это вывод, полученный в качестве наблюдателя, и научно подготовленный наблюдатель предоставит нам все воспринимаемые реальности. Шаблон наблюдателя предназначен для того, чтобы объект мог отслеживать состояние и знать, когда оно изменяется. Как только состояние изменится, все подписчики будут уведомлены об этом. Если необходимо обеспечить согласованность состояния (например, применение классов триггеров состояния), но для данного состояния может быть несколько уровней пользователей, шаблон наблюдателя в этом случае очень применим и полезен, и у каждого есть свои обязанности. Используя шаблон наблюдателя, можно поддерживать согласованность при записи количества объектов, создающих заданное состояние.
Модель наблюдателя интуитивно понятна. Зачем позволять нескольким объектам создавать или отслеживать заданное состояние? Для объекта было бы гораздо разумнее сделать это, а затем уведомить другие объекты, которые могут использовать это состояние.
Реализация режима наблюдателя с РАЗДЕЛЕНИЕМ
1. Три интерфейса/класса SPL для шаблонов проектирования наблюдателей следующие: ● SplSubject ● SplObserver ● Хранилище объектов Splobject
1.1,Объект SplSubject
Обратите внимание, что этот интерфейс SplSubject указывает, что тип данных $observer в параметрах метода attach () и detach () должен быть объектом SplObserver.
1.2,Сервер SplObserver
Интерфейс SplObserver имеет только один метод update (), следующий:
Метод update () имеет решающее значение для шаблона наблюдателя, поскольку он получает последние изменения в состоянии объекта и передает их экземпляру наблюдателя.
1.3.Хранилище объектов Splobject
Класс SplObjectStorage не имеет внутренней связи с шаблоном проектирования наблюдателя, но его встроенные методы attach () и detach () позволяют легко связать и отменить связь экземпляра наблюдателя с экземпляром субъекта.
storage[] = $observer; } // Delete method public function detach(SplObserver $observer) { if(is_int($idx = array_search($observer, $this->storage))) { unset($this->storage[$idx]); } } }
Примечание: Если вы используете класс SPObjectStorage библиотеки классов PHP напрямую, 1.3 можно игнорировать, просто нужно использовать 1.4 внутри ___________ $this->observers SplObjectStorage();
Изменено на $this->observers \SplObjectStorage();
(Причина в том, чтобы перейти к безымянному пространству и механизму загрузки файлов PHP. Ссылки), в методе уведомления $this->наблюдатели->хранилище
Изменено на |/$this->наблюдатели Да.
1.4. Конкретная тема SPL
Интерфейс SplSubject не включает методы доступа и настройки, но это также часть шаблона проектирования наблюдателя, поэтому необходимо добавить методы доступа и настройки. Метод установки setData () содержит параметр, представляющий собой любой тип добавляемых данных. Метод получения getData () сохраняет текущее состояние темы и используется конкретными наблюдателями для обновления данных наблюдателя. Также добавлен метод set Observers (). Вместо установки экземпляров SplObjectStorage () в конструкторах или экземпляров наблюдателей в методах setData () реализован отдельный метод setObservers (), обеспечивающий более простое взаимодействие и позволяющий нескольким группам наблюдателей.
observers = new SplObjectStorage(); } // Adding observers public function attach(SplObserver $observer) { $this->observers->attach($observer); } // Exclude the observer public function detach(SplObserver $observer) { $this->observers->detach($observer); } // Notify notify public function notify() { foreach ($this->observers->storage as $key =>$observer) { $observer->update($this); } } // Setting method public function setData($dataNow) { $this->data=$dataNow; } // Acquisition method public function getData() { return $this->data; } } ?>
1.5. Конкретные наблюдатели SPL
Используется для реализации функций обновления для обновления связанных экземпляров наблюдателей.
getData().""; } } ?>
(Дополнительный Общий Наблюдатель Для Конкретного Пользователя)
1.6. Клиенты SPL
Класс клиентов “SPL” – это просто стандартный клиент. Клиент отправляет несколько запросов определенным темам и наблюдателям в соответствии с интерфейсом SPL, но сам не реализует классы и интерфейсы SPL.
creates new concrete observers and new concrete subjects: "; $ob1 = new ConcreteObserver(); $ob2 = new ConcreteObserver(); $ob3 = new ConcreteObserver(); $Subject = new ConcreteSubject(); $Subject->setObservers(); Subject - > setData ("This is your data!"); $Subject->attach($ob1); $Subject->attach($ob2); $Subject->attach($ob3); $Subject->notify(); Echo "Delete ob3, resulting in notifications of ob1 and ob2:
"; $Subject->detach($ob3); $Subject->notify(); Echo "Remaining data and additional data also delete ob2, resulting in notification of ob1 and ob3:
"; Subject - > setData ("More data, only ob1 and ob3 are needed"); $Subject->attach($ob3); $Subject->detach($ob2); $Subject->notify(); Echo "< H3 > residual data and additional new data, the result is that ob1 and ob3 also have"new data"notification: "; $Subject->attach(new \common\observer\UserObserver); $Subject->notify(); } } ?>
1.7. Вывод вызова Клиента выглядит следующим образом:
Вызов: Клиент общего наблюдателя ();
Выход:
Резюме и анализ
Здесь класс SplObjectStorage написан мной, и я опубликую его, чтобы поделиться с вами. PHP 5.1.0 и более поздние версии имеют множество функций, одна из которых заключается в предоставлении набора интерфейсов для шаблонов проектирования наблюдателей. Вы можете изучить, как использовать интерфейс SplObserver и интерфейсы SplSubject и SplObjectStorage. Используя эти интерфейсы, легко построить шаблон наблюдателя. “SPL” – это сокращение от стандартной библиотеки PHP, которая включает в себя набор интерфейсов и классов для решения стандартных задач. Справочное руководство
Сопутствующая информация
На модели наблюдателя Быстрая реализация шаблонов проектирования наблюдателей с помощью объектного хранилища структуры данных SPL Стандартной библиотеки PHP SPL