Шаблон Наблюдателя против "Слушателей" - PullRequest
122 голосов
/ 29 июля 2010

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

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

Ответы [ 3 ]

52 голосов
/ 29 июля 2010

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

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

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

23 голосов
/ 10 апреля 2013

Существует двусторонняя природа описания Observer в Design Patterns Gamma et.и др.(GoF).

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

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

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

3 голосов
/ 29 июля 2010

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

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

...