Я перебираю некоторые вопросы о шаблонах проектирования и рассмотрел определение и примеры шаблона Decorator в GoF.Там написано:
Придайте дополнительные обязанности динамически.Декораторы предоставляют гибкую альтернативу подклассам для расширения функциональности.
В нем приводятся примеры декораторов, которые используют наследование, которое, безусловно, не является динамическим.
NetObjectives допускает ту же ошибку:
http://www.netobjectives.com/PatternRepository/index.php?title=TheDecoratorPattern
Обсуждение Декоратора репозитория паттернов в Портленде показывает, что существует путаница в том, что является декоратором, а что нет.
http://c2.com/cgi/wiki?DecoratorPattern
ВикипедияИмеет некоторый смысл этого противоречия, отмечая, что делегат внутри Decorator должен быть установлен во время построения (другие методы DI также будут работать)
http://en.wikipedia.org/wiki/Decorator_pattern
Все примеры шаблона Decorator (в Java или C ++) требуется статическая конструкция либо через наследование, либо путем реализации интерфейса.Объяснение в GoF говорит, что дополнительные обязанности, однако, устанавливаются динамически.Но это просто неправильно.
Комментарии в PPR говорят о динамических языках, которые могут добавлять методы во время выполнения, но Java и C ++ не являются динамическими, и в объяснении Decorator не говорится, что он ограничен динамическими языками, такими какGroovy и Lisp.
Разве правильное объяснение Decorator не говорит о том, что в языках, которые не поддерживают создание динамических методов, участвуют как статические, так и динамические конструкции?
Объяснение GoF просто неверно, так какпоказано на собственных примерах, или я что-то не так понял?