Подтвердить что ты не робот

Шаблон проектирования наблюдателя против "Слушателей"

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Существует двунаправленный характер описания Observer в шаблонах проектирования от Gamma et. и др. (GOF),.

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

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

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

Ответ 3

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

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