Шаблон проектирования Observer - это решение для слабой связи объектов, чтобы они могли работать вместе.В PHP вы можете легко реализовать это, используя только два класса .
По сути, у вас есть субъект, который может уведомлять и обновлять список наблюдателей об изменениях своего состояния.
Проблема, которую я пытаюсь решить, состоит в том, чтобы узнать, как обработчик оповещает наблюдателей о различных состояниях объекта, который они наблюдают.
Например, допустим, у нас есть файлкласс загрузки, к которому мы присоединяем класс журналирования, класс websockets и класс изменения размера изображения.Каждый из этих классов, которые наблюдают, хочет знать о различных событиях в процессе загрузки.
Этот класс загрузки файлов может иметь три места, где он должен уведомить прослушивающие классы, что что-то произошло.
- Ошибка при загрузке (класс регистрации предупреждений)
- Успешная загрузка (класс предупреждений)
- Успешная загрузка и файл образа (класс изменения размера предупреждений)
Это очень простой пример, но как вы справляетесь с несколькими событиями, о которых разные наблюдатели могут знать?Одного вызова notifyObservers () было бы недостаточно, поскольку каждому наблюдателю необходимо знать, о чем он уведомляется.
Одна мысль состоит в том, что я мог бы при вызове указать, какой тип события наблюдается:
$this->notifyObservers('upload.error', this);
Однако это означало бы, что я должен был бы добавить настраиваемое переключение на самих наблюдателей, чтобы знать, как обрабатывать различные события.
function observe($type, $object)
{
if($type === 'upload.error') $this->dosomething();
elseif($type === 'something.else') $this->otherthing();
...etc...
}
Я нахожу это очень уродливым, поскольку он начинает соединятьнаблюдатели возвращаются в класс, который они наблюдают.
Опять же, если я просто сообщу Наблюдателям, не передавая никакой информации о том, что событие просто происходит - они должны сами догадаться, что происходит, что означает больше проверок if ().