В C # разве шаблон observer уже не реализован с использованием Events?

StackOverflow https://stackoverflow.com/questions/32034

  •  09-06-2019
  •  | 
  •  

Вопрос

После прочтения книги Head First Design Patterns и использования ряда других шаблонов проектирования я пытаюсь понять шаблон Observer.Разве это уже не реализовано с использованием Events в .NET Framework?

Это было полезно?

Решение

Да, это так.Шаблон наблюдателя также называется шаблоном публикации / подписки, и это именно то, что события позволяют вам делать.

Другие советы

Я бы сказал, да, это было намерение Андерса Хелджсберга сделать шаблон observer первоклассной языковой функцией с событиями на C #, основанной на его опыте работы с Delphi.Андерс разъясняет это и другие дизайнерские замыслы в превосходном интервью на Разработка программного обеспечения Радио.

Да, это идентично.

Записка:если вы действительно хотите понять события, я рекомендую изучить шаблон observer и реализовать его самостоятельно на некоторое время.Как только вы полностью поймете это, прекратите делать это самостоятельно и используйте профессиональную и хорошо документированную реализацию, если только у вас нет реальной необходимости поступать иначе.

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

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

Рассмотрим разницу:

public void NotifyObservers()
{
    foreach(Product product in ProductList)
    {
        if (product is IProductObserver)
        {
               product.Update(this)
        }
    }
}

Здесь очень ясно, какие продукты в списке получают уведомления об изменениях.Во время отладки вы можете просмотреть список продуктов...

При использовании делегатов и событий может оказаться более громоздким выяснить, сколько "делегатов" на самом деле были "подписаны" на обработку события.

Большинство современных языков имеют встроенную поддержку некоторых шаблонов проектирования.Утверждалось, что языки тем лучше, чем больше шаблонов они поддерживают изначально без необходимости их явной реализации, и что Lisp превосходен в этом отношении.Джефф был хочу что-то сказать и об этом тоже.

Майкрософт Сам по себе утверждает, что использование событий и делегатов - это способ применения шаблона Observer на c #.Используя некоторые базовые соглашения об именовании событий и делегатов, они назвали свой собственный шаблон следующим образом "Схема событий" который делает точно то же самое, предоставляя некоторые дополнительные преимущества по сравнению с классическим Шаблон наблюдателя.

"Схема событий" описано в библиотеке MSDN внутри "Изучение шаблона проектирования Observer" Статья.

Ссылка на статью MSDN

Основываясь на событиях и делегатах, FCL довольно широко использует шаблон Наблюдателя.Разработчики FCL полностью осознали присущую этому шаблону мощь, применив его как к пользовательскому интерфейсу, так и к функциям, не связанным с пользовательским интерфейсом, по всему Фреймворку.Это использование, однако, является небольшим изменением базового шаблона наблюдателя, который команда разработчиков Фреймворка назвала Шаблоном событий.В общем, этот шаблон выражается в виде формальных соглашений об именовании делегатов, событий и связанных с ними методов, участвующих в процессе уведомления о событиях.Корпорация Майкрософт рекомендует всем приложениям и фреймворкам, использующим события и делегаты, использовать этот шаблон, хотя в среде CLR или стандартном компиляторе нет принудительного применения

Основываясь на этом исследовании шаблона Observer, должно быть очевидно, что этот шаблон предоставляет идеальный механизм для обеспечения четких границ между объектами в приложении, независимо от их функции (пользовательский интерфейс или иное).Хотя концепции делегатов и событий CLR довольно просты в реализации с помощью обратных вызовов (с использованием интерфейсов IObserver и IObservable), они выполняют большую часть "тяжелой работы", а также снижают уровень связи между субъектом и наблюдателем.

Нет, они достигают одной и той же цели, однако они разные.Я бы сказал, что шаблон Observer - это довольно сложный дизайн для достижения того, чего вы могли бы легко достичь с помощью функционального программирования, и это.NET events использует функциональное программирование для достижения той же цели.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top