Я думаю, что ответы в связанной (канонической) ветке в основном хороши, и их комбинация дает довольно полную картину этих двух шаблонов проектирования; но, возможно, будет полезно немного больше из книги вместе с немного другой терминологией. Каждый декоратор обрабатывает каждое сообщение. Это подразумевает количество элементов, равное двум или более. Существует базовое c поведение, которое клиент желает улучшить с помощью одного или нескольких дополнительных вариантов поведения, то есть минимум два поведения.
Цепочка ответственности описывается в книге как одно поведение или меньше. Возможность использования нескольких ссылок для обработки одного сообщения достаточно легко представить, но не упоминается в книге. Количество элементов равно нулю к единице.
Однако самая большая разница заключается в том, где создается экземпляр составляющего объекта. Как правило, декораторы создаются непосредственно клиентом, потому что клиент точно знает, какие улучшения он хочет обернуть вокруг некоторого базового c поведения. Когда клиент делает запрос, он явно знает получателей, потому что он объединил их вместе перед отправкой запроса.
Цепочка ответственности невидима для клиентов.
Объект, который отправивший запрос не знает, кто будет его обрабатывать - мы говорим, что запрос имеет неявный получатель .
Это приводит к основной причине, по которой клиент будет вызывать CoR, а не чем декоратор: потому что у клиента недостаточно информации для выбора декоратора. CoR настраивается где-то еще, и клиент не знает, какие альтернативные обработчики доступны, или даже о том, что вызываемый им обработчик вообще является частью цепочки.
Декораторы выигрывают от более умного клиента . Цепочка ответственности - это продукт конфигурации.
Еще одна веская причина для реализации CoR - это когда ваше приложение уже спроектировано как некоторая форма иерархии или древовидной структуры. В случае, когда между объектами уже существуют «преемники» связи, добавить часть «Ответственность» относительно просто, потому что цепочка уже существует. GoF не раз замечает, как CoR хорошо работает с Composite Pattern, потому что последний предоставляет ссылки для CoR, которые можно использовать.
Я считаю, что это также может быть причиной классификации CoR как поведенческого шаблона. В случае, когда дерево объектов уже существует (что довольно часто), структурные изменения не требуются для реализации CoR. Это просто изменение поведения уже существующей структуры. С другой стороны, новый декоратор всегда вводит новые отношения композиции, которые представляют собой структурные изменения в соответствии с категориями GoF.