Это старая статья, но я все равно буду ей звонить, потому что другие ответы не имеют отношения к тому, что происходит при использовании любого из паттернов, они скорее касаются теории, чем практики.
Как работают делегация и наблюдатель
С делегированием делегат точно выбирает, кто будет отвечать на конкретное событие в момент создания источника потенциального события. Вы можете думать об этом слушателе как о едином наблюдателе . В случае паттерна Observer наблюдатель выбирает, кого он наблюдает, когда ему это нравится; таким образом, зависимости обращаются, когда дело доходит до наблюдателя против делегирования. С моделью наблюдателя думайте о газете и подписчиках как о наблюдателях. Наблюдатели контролируют, когда создаются отношения. С делегацией подумайте о работнике и работодателе. Работодатель контролирует, когда создаются отношения и кто конкретно отвечает за конкретные события. Сотрудники не могут выбирать, над какими задачами они работают ... в общем.
Некоторые утверждают, что делегирование может иметь одного наблюдателя, но я думаю, что реальная разница между ними заключается в том, как назначается обработка событий. Вы никогда не увидите регистрацию делегата на событие. Он никогда не узнает, обрабатывает ли оно событие, пока оно не произойдет, и делегат не вызовет для него открытый метод.
Преимущество делегирования
Эта модель очень жесткая, а с большинством правильных конструкций она более простая и в целом более надежная. Это заставляет вас заранее объявить обработчик события во время инициализации источника потенциального события. Если вам нужен кто-то, чтобы направлять трафик, вы назначаете директора по трафику, прежде чем открыть улицу. В случае наблюдателя вы могли бы позволить гаишнику выбирать, когда направлять трафик в любое время, когда он или она захотят этого.
Недостаток делегирования
Недостаток этого дизайна в том, что он не гибкий. Если бы вы внедрили какой-то код для подписки на газету, газете / делегату пришлось бы точно определить, кто может читать новостные сюжеты в момент их создания. По схеме наблюдателя они могут быть зарегистрированы позже в любое время, и газете нужно будет только знать, что новый человек зарегистрировался.
Когда выбрать делегацию?
Если вам нужен один конкретный (ые) наблюдатель (и), и у вас нет причин для изменения того, кто наблюдает, тогда будет полезен жесткий дизайн схемы делегирования.
Например, вам нужен класс / объект для обработки всплывающих окон для конкретной ошибки. Существует не так много причин, почему во время выполнения вам нужно было бы переключаться между тем, кто обрабатывает конкретную ошибку, поэтому имеет смысл делегировать ошибку «Недостаточно памяти» одному объекту. Создание массива потенциальных обработчиков и последующая регистрация этих обработчиков для ошибки «Недостаточно памяти» не имеет большого смысла; это было бы примером использования модели наблюдателя в этой ситуации. Во время выполнения вы можете захотеть изменить то, какие методы вызываются или какой «делегат» вызывается для переменных событий, но выгрузка обработчика события для определенного события во время выполнения не является нормальной.
Нельзя поменять местами делегатов, как в случае с наблюдателем, это просто сложно. В реальном мире, возможно, вы хотите поменять гаишников, чтобы новый делегат обрабатывал трафик. Можно утверждать, что лучший дизайн позволил бы сделать оригинального делегата полицейским участком, а не одного полицейского, но я отвлекся ...