В настоящее время я следую классу о Design Patterns и задаюсь вопросом, является ли EventListener
Observable
?
Я не вижу разницы между ними, потому что у обоих есть список подписчиков и уведомлять этих подписчиков, когда что-то изменилось.
В настоящее время я следую классу о Design Patterns и задаюсь вопросом, является ли EventListener
Observable
?
Я не вижу разницы между ними, потому что у обоих есть список подписчиков и уведомлять этих подписчиков, когда что-то изменилось.
An Observable
- это просто объект, где вы можете наблюдать за его действиями. Итак, что угодно, где вы можете прослушивать действие, а затем сказать, что действие происходит, это Observable
.
Это означает, что прослушиватель событий один. Поскольку вы можете прослушивать события, и события немедленно сообщают вам, что они произошли.
Лично, когда кто-нибудь говорит Observable
, я думаю о событиях. Это мой пример резака для печенья того, что наблюдаемые. Аналогичным примером будет система публикации-подписки, которая представляет собой просто события под другим именем (у него есть тонко другой вариант использования).
По моему опыту, шаблон прослушивателя событий отличается от шаблона проектирования Observer. Это не просто другое имя или часть которого.
Я должен поговорить об этом конкретно. Например, эта страница дает реализацию С# для системы прослушивания событий. В этой системе слушатель регистрирует свою функцию обработки событий с помощью одноэлементного класса Events
и утверждает, что он может обрабатывать определенный тип события. Events
поддерживает словарь для сопоставления каждого типа события с его обработкой. С другой стороны, любой класс, который хочет инициировать событие, должен сделать это с помощью одноэлементной функции Events.instance.Raise()
.
Здесь мы можем видеть 3 отличия:
Во-первых, цель двух шаблонов отличается: шаблон шаблона Listener должен отделить код обнаружения/повышения события от кода обработки событий, так что при изменении или добавлении новых кодов обработки событий не влияет на другие коды обработки событий; Шаблон проектирования наблюдателя должен сделать некоторые объекты, чтобы следить за изменениями другого объекта.
Структура данных также различна. В шаблоне Designer Listener существует только один глобальный словарь для сопоставления каждого типа событий с его методом обработки. Это отображение равно 1 к 1. Пока в "Наблюдательном патче" каждый наблюдаемый предмет поддерживает список наблюдателей. Это сопоставление является 1-ко-многим: один субъект для многих наблюдателей. Могут быть множественные экземпляры таких отношений между субъектами-наблюдателями 1-ко-многим.
Поведение отличается. В шаблоне проектирования приемника, когда происходит событие, агент сбора уведомлений уведомляет глобальный посредник (singleton Events.instance
), поскольку он не имеет информации о обработчиках событий. Пока в Шаблоне наблюдателя, когда происходят какие-либо изменения, наблюдаемый субъект непосредственно уведомляет всех наблюдателей.
Я тоже сделал еще несколько исследований, изучая исходный код JDK. Я думаю, что единственное различие между ними заключается в том, что Observable
использует синхронизацию при добавлении Observers
, а EventListener
- не (по крайней мере, AbstractButton
).
Да, похоже, что очередь событий, в которой вы регистрируете слушателей для определенных событий, будет примером шаблона наблюдателя.