Я прочитал шаблон дизайна декоратора из wiki http://en.wikipedia.org/wiki/Decorator_pattern и пример кода из http://www.vincehuston.org/dp/decorator.html.
Я вижу, что традиционное наследование следует за шаблоном "is-a", тогда как декоратор следует за шаблоном "has-a". И вызывающая конвенция декоратора выглядит как "скин" поверх "кожи".. над "ядром". например.
I* anXYZ = new Z( new Y( new X( new A ) ) );
как показано в приведенной выше ссылке на пример кода.
Однако есть еще несколько вопросов, которые я не понимаю:
-
Что означает wiki: "Шаблон декоратора может использоваться для расширения (украшения) функциональности определенного объекта во время выполнения?" new... (new... (new...)) "- это вызов во время выполнения, и он хорош, но" AwiспасибоYZ anXYZ;" является наследованием во время компиляции и является плохим?
-
из ссылки на пример кода я вижу, что число определения класса почти одинаковое в обеих реализациях. Я вспоминаю в некоторых других книгах по дизайну, таких как "Head first design patterns". В качестве примера они используют кофе Starbuzz и говорят, что традиционное наследование приведет к "взрыву класса" , потому что для каждой комбинации кофе вы получите класс для этого. Но разве это не то же самое для декоратора в этом случае? Если класс декоратора может взять ЛЮБЫЙ абстрактный класс и украсить его, то я предполагаю, что он предотвращает взрыв, но из примера кода у вас есть точное определение классов, не менее...
Может ли кто-нибудь помочь объяснить?
Большое спасибо,