Разве в C# шаблон наблюдателя уже не реализован с помощью событий?



Прочитав первую главу книги "шаблоны проектирования" и используя ряд других шаблонов проектирования, я пытаюсь понять шаблон наблюдателя. Разве это уже не реализовано с помощью событий в .NET Framework?

668   8  

8 ответов:

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

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

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

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

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

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

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

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

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

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

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

Microsoft сама утверждает, что использование событий и делегатов является способом применения шаблона наблюдателя на языке c#. Используя некоторые базовые соглашения об именовании событий и делегатов, они назвали свой собственный шаблон как "шаблон событий", который делает точно то же самое, обеспечивая некоторые дополнительные преимущества по сравнению с классическим шаблоном наблюдателя.

"шаблон событий" описывается в библиотеке MSDN внутри " , исследующей шаблон проектирования наблюдателя" Статья.

Ссылка MSDN Article

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

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

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

Comments

    Ничего не найдено.