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


136

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

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


19
В первом случае один код следит за движением другого кода, а во втором один код прослушивает другой код на предмет помех.
Нейт с

2
Что означает GOF?
декабрь

Ответы:


60

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

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

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


26

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

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

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

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


4

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.