Является ли EventListener наблюдаемым? - PullRequest
19 голосов
/ 09 мая 2011

В настоящее время я слежу за классом по шаблонам проектирования, и мне было интересно, является ли EventListener Observable?

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

Ответы [ 4 ]

24 голосов
/ 09 мая 2011

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

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

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

10 голосов
/ 09 сентября 2014

По моему опыту, шаблон прослушивателя событий отличается от шаблона проектирования наблюдателя.Это не просто другое имя или часть которого.

Я должен поговорить об этом конкретно.Например, эта страница дает ac # реализацию системы прослушивателя событий.В этой системе слушатель регистрирует свою функцию обработки событий с помощью одноэлементного класса Events и утверждает, что он может обрабатывать события определенного типа.Events поддерживает словарь для сопоставления каждого типа события с его функцией-обработчиком.С другой стороны, любой класс, который хочет вызвать событие, должен сделать это через функцию синглтона Events.instance.Raise().

Здесь мы можем видеть 3 различия:

Во-первых, предназначение двух шаблонов различаются: шаблон проектирования прослушивателя предназначен для отделения кода обнаружения / вызова события от кода обработки события, чтобы при изменении или добавлении новых кодов обработки события он не влиял на другиекоды обработки событий;Шаблон проектирования наблюдателя должен заставить некоторые объекты следовать изменениям другого объекта.

Структура данных также отличается.В Pattern Designer Listener существует только один глобальный словарь для сопоставления каждого типа события с его методом обработки.Это отображение 1-к-1.Находясь в шаблоне наблюдателя, каждый наблюдаемый объект ведет список наблюдателей.Это отображение 1-ко-многим: один предмет для многих наблюдателей.Может быть несколько примеров таких отношений «один ко многим субъект-наблюдатель».

Поведение отличается.В Pattern Designer Listener, когда происходит событие, сборщик событий уведомляет о глобальном посреднике (singleton Events.instance), потому что у него нет информации об обработчиках событий.Находясь в паттерне наблюдателя, когда происходит какое-либо изменение, наблюдаемый субъект напрямую уведомляет всех наблюдателей.

2 голосов
/ 17 мая 2011

Я тоже провел дополнительное исследование, изучая исходный код JDK. Я думаю, что единственное различие между ними заключается в том, что Observable использует синхронизированный при добавлении Observers, а EventListener - нет (по крайней мере, AbstractButton - нет).

0 голосов
/ 09 мая 2011

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

...