Шаблон проектирования наблюдателя - это решение для слабого связывания объектов, чтобы они могли работать вместе. В PHP вы можете легко реализовать это, используя только два класса .
По сути, у вас есть субъект, который может уведомлять и обновлять список наблюдателей об изменениях своего состояния.
Проблема I ' m пытается решить, это знать, как обработать, предупреждая наблюдателей о различных состояниях наблюдаемого объекта.
Например, допустим, у нас есть класс загрузки файла, к которому мы присоединяем класс ведения журнала, класс 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 ().