Этот ответ почти описывает первую половину вопроса.
Он говорит:
Прочитав определения «Банды четырех», я не уверен, что есть реальная разница. (включены для удобства)
- Декоратор: позволяет динамически обертывать объекты, чтобы изменить их существующие обязанности и поведение.
- Цепочка ответственности: дает возможность нескольким объектам обрабатывать запрос путем связывания получающих объектов вместе.
Википедия немного уточняет их, но некоторые из них произвольны.
Декоратор обычно реализуется как связанный список. Но я думаю, что это слишком низкий уровень, чтобы его можно было рассматривать как часть схемы.
Ссылки цепочки ответственности обрабатывают данные только в том случае, если это их ответственность; но определение ответственности и обработка данных являются частью поведения. Декораторы могут сделать это так же легко.
Декоратор требует, чтобы вы позвонили делегату.
Ссылка на чистую CoR должна вызывать делегата только в том случае, если он не обрабатывает данные. Первые два атрибута на самом деле не различают шаблоны.
Вторые два работают, но способ, которым обычно реализуются Decorator и CoR, не применяет эти атрибуты - разработчик просто надеется, что никто не напишет Decorator, который разрывает цепочку, или CoRLink, который продолжает цепочку после обработки данных.
Структура обоих паттернов практически идентична. Что заставляет шаблон декоратора реализовываться таким образом? Вместо того, чтобы иметь ConcreteElement
и несколько Decorator
, что мешает мне просто иметь каждый Decorator
, указывающий на объект, который он обертывает, и когда указатель на оборачиваемый объект равен null
, то делать то же самое, что и в ConcreteElement
? Что делает каждую структуру специфичной для своего рисунка?
Кроме того, почему они находятся в разных категориях? Кроме того, читая другие ответы здесь, похоже, что хотя структура почти такая же, цель другая. CoR
предназначен для наличия пары потенциальных объектов, которые могут обрабатывать запрос, а объект, который будет обрабатывать запрос, заранее неизвестен. В то время как декоратор предназначен для обертывания объекта и добавления некоторых функций во время выполнения (почему я не могу сделать это с помощью CoR?). Есть ли смысл в том, что CoR
(который предназначен для структурирования нескольких объектов, способных обрабатывать запрос вместе в цепочке) должен быть behavioral
? Не кажется ли, что это должно быть structural
? Кроме того, действительно ли это имеет смысл для Decorator
(который предназначен для инкапсуляции некоторого поведения и присоединения его к какому-либо заданному объекту позже) как structural
? Не кажется ли, что это должно быть behavioral
?