Как реализовать полный шаблон Observer в PHP

Шаблон проектирования наблюдателя - это решение для слабого связывания объектов, чтобы они могли работать вместе. В 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 ().

5
задан Xeoncross 16 June 2011 в 15:21
поделиться