Является ли EventListener наблюдаемым?

В настоящее время я следую классу о Design Patterns и задаюсь вопросом, является ли EventListener Observable?

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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