По моему опыту, шаблон прослушивателя событий отличается от шаблона проектирования наблюдателя.Это не просто другое имя или часть которого.
Я должен поговорить об этом конкретно.Например, эта страница дает ac # реализацию системы прослушивателя событий.В этой системе слушатель регистрирует свою функцию обработки событий с помощью одноэлементного класса Events
и утверждает, что он может обрабатывать события определенного типа.Events
поддерживает словарь для сопоставления каждого типа события с его функцией-обработчиком.С другой стороны, любой класс, который хочет вызвать событие, должен сделать это через функцию синглтона Events.instance.Raise()
.
Здесь мы можем видеть 3 различия:
Во-первых, предназначение двух шаблонов различаются: шаблон проектирования прослушивателя предназначен для отделения кода обнаружения / вызова события от кода обработки события, чтобы при изменении или добавлении новых кодов обработки события он не влиял на другиекоды обработки событий;Шаблон проектирования наблюдателя должен заставить некоторые объекты следовать изменениям другого объекта.
Структура данных также отличается.В Pattern Designer Listener существует только один глобальный словарь для сопоставления каждого типа события с его методом обработки.Это отображение 1-к-1.Находясь в шаблоне наблюдателя, каждый наблюдаемый объект ведет список наблюдателей.Это отображение 1-ко-многим: один предмет для многих наблюдателей.Может быть несколько примеров таких отношений «один ко многим субъект-наблюдатель».
Поведение отличается.В Pattern Designer Listener, когда происходит событие, сборщик событий уведомляет о глобальном посреднике (singleton Events.instance
), потому что у него нет информации об обработчиках событий.Находясь в паттерне наблюдателя, когда происходит какое-либо изменение, наблюдаемый субъект напрямую уведомляет всех наблюдателей.