Я недавно начал копаться в C #, но я не могу своей жизнью понять, как работают делегаты при реализации шаблона наблюдатель / наблюдаемый в языке.
Может ли кто-нибудь дать мне супер-простой пример того, как это делается? Я бы гугле, но все примеры , которые я нашел , были либо слишком проблемы конкретных или слишком «раздутыми».
c#
events
delegates
observer-pattern
Дениз Доган
источник
источник
SomethingHappened = null
позже (удобный, если ленивый и неидеальный способ отписаться от всех обработчиков), поэтому проверка на null всегда необходима.SomethingHappened?.Invoke(this, EventArgs.Empty);
Вот простой пример:
Примечание:
источник
В этой модели у вас есть издатели, которые выполнят некоторую логику и опубликуют «событие».
Издатели будут разослать свое событие только подписчикам, которые подписались на получение конкретного события.
В C # любой объект может публиковать набор событий, на которые могут подписаться другие приложения.
Когда класс публикации вызывает событие, все подписанные приложения получают уведомление.
На следующем рисунке показан этот механизм.
Простейший возможный пример для событий и делегатов в C #:
код не требует пояснений. Также я добавил комментарии, чтобы прояснить код.
Вывод:
Слышал это слушателем
Слышал это Listener2
Слышал это слушателем
Слышал это Listener2
Слышал это слушателем. , , (бесконечное количество раз)
источник
Я связал вместе пару замечательных примеров выше (спасибо, как всегда, мистеру Скиту и мистеру Карлсену ), чтобы включить пару разных Observables, и использовал интерфейс, чтобы отслеживать их в Observer, и позволил Observer для "наблюдения" за любым количеством Observable через внутренний список:
источник
Применение шаблона наблюдателя с делегатами и событиями в C # называется «Шаблон событий» в соответствии с MSDN, что является небольшим изменением.
В этой статье вы найдете хорошо структурированные примеры того, как применять шаблон в C # как классическим способом, так и с использованием делегатов и событий.
Изучение паттерна разработки Observer
источник
источник
Я не хотел изменять исходный код для добавления дополнительного наблюдателя, поэтому написал следующий простой пример:
источник
Что-то вроде этого:
, шаблон наблюдателя C # с событием . ссылка на репозиторий
источник