Шаблон Наблюдателя против «Слушателей»

136

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

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

JohnnyLambada
источник
19
В первом случае один код следит за движением другого кода, а во втором один код прослушивает другой код на предмет помех.
Нейт с
2
Что означает GOF?
декабрь
5
@dekaru Gang of Four: en.wikipedia.org/wiki/Design_Patterns
bitsoflogic

Ответы:

60

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

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

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

Дерек Грир
источник
26

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

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

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

Итак, я бы сказал, что Слушатель - это менее обобщенный случай Обозревателя.

Ричард Верёзак
источник
4

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

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

Майк
источник