Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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

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

Ответ 8

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