Разница между этими шаблонами не связана с тем, когда или как цепь может быть разорвана (что предполагает цепочку) или когда выполняется дополнительное поведение. Они связаны тем, что оба используют композицию в пользу наследования, чтобы обеспечить более гибкое решение.
Ключевое отличие состоит в том, что декоратор добавляет новое поведение, которое фактически расширяет исходный интерфейс. Это похоже на то, как обычное расширение может добавлять методы, за исключением того, что «подкласс» связан только со ссылкой, что означает, что можно использовать любой «суперкласс».
Шаблон COR может изменить существующее поведение, которое аналогично переопределению существующего метода с использованием наследования. Вы можете вызвать super.xxx (), чтобы продолжить цепочку или обработать сообщение самостоятельно.
Так что разница невелика, но пример декоратора должен помочь:
interface Animal
{
Poo eat(Food food);
}
class WalkingAnimal implements Animal
{
Animal wrapped;
WalkingAnimal(Animal wrapped)
{
this.wrapped = wrapped;
}
Position walk(Human walker)
{
};
Poo eat(Food food)
{
return wrapped.eat(food);
}
}
class BarkingAnimal implements Animal
{
Animal wrapped;
BarkingAnimal(Animal wrapped)
{
this.wrapped = wrapped;
}
Noise bark()
{
};
Poo eat(Food food)
{
bark();
return wrapped.eat();
}
}
Вы можете видеть, что мы можем составить животное для ходьбы, лая ... или фактически добавить способность лаять любому животному. Чтобы использовать это дополнительное поведение напрямую, нам нужно сохранить ссылку на декоратор BarkingAnimal.
Все BarkingAnimal также лают один раз перед едой, что изменило существующую функциональность и поэтому похоже на COR. Но цель не совпадает с COR, то есть найти одно животное из многих, которое будет есть пищу. Цель здесь - изменить поведение.
Вы могли бы представить, что COR применяется, чтобы найти человека, который возьмет животное на прогулку. Это может быть реализовано в виде связанного списка, подобного chained
выше, или в виде явного списка ... или чего-либо другого.
Надеюсь, это достаточно ясно!
John