Является ли 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
Да, похоже, что очередь событий, в которой вы регистрируете слушателей для определенных событий, будет примером шаблона наблюдателя.