Observer Design Pattern vs " слушатели"

Мне кажется, что шаблон дизайна наблюдателя, описанный в GOF, действительно то же самое, что и слушатели, найденные в различных наборах инструментов. Есть ли разница между понятиями, или слушатели и наблюдатели действительно одно и то же.

(Я не ищу какой-либо конкретной реализации компьютерного языка, я просто хочу понять разницу (если таковая имеется) с точки зрения дизайна. Да, я знаю, что есть несколько ответов на подобные вопросы на SOF, но они коренятся в конкретные вопросы о конкретных языках - я ищу дизайнерский ответ, а не языковой ответ.)

3 ответов


относится ли термин "слушатель" к шаблону наблюдателя или нет, будет зависеть от контекста. Например, "прослушиватели событий" Java Swing являются частью реализации шаблона наблюдателя, а "прослушиватели трассировки" .Net-нет.

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

Что касается дизайна, реализация данного шаблона часто будет зависеть от используемого языка и платформы. Таким образом, конкретная реализация шаблона наблюдателя в данной структуре (которая может использовать термин "слушатель" для описания роли ConcreteObserver) может немного отличаться от описанной в книге шаблонов проектирования.


существует двусторонний характер описания наблюдателя в шаблонах проектирования Gamma et. Эл. (Гоф).

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

общие реализации слушателей, похоже, все реагируют на события извне.

Итак, я бы сказал, что слушатель является менее обобщенным случаем наблюдателя.


слушатель вполне может быть реализацией шаблона наблюдателя. Слушатель, по сути, ждет, когда событие произойдет на данном объекте, что и делает наблюдатель.

Я знаю, что вам не нужен конкретный ответ на языке, но об этом трудно говорить абстрактно. Поэтому, если бы я должен был исследовать это в .NET, я был бы склонен открыть сборку, содержащую прослушиватель в .NET Reflector, который позволит мне разобрать сборку и проверить ее логика против шаблона проектирования.