К соажалению, вы упустили важнейшую деталь этого паттерна — декоратор _динамически_ меняет поведение без внесения _изменений_ в сам класс, а у вас наследование заменено трейтом инджектируемым в класс.
$window = new StandartWindow();
$windowWithCoolScroll = new DecoratorCoolScrol($window);
$windowWithCoolScroll->render();
$windowWithoutScroll = new DecoratorWithoutScrol($window);
$windowWithoutScroll->render();
Это мое личное мнение, но все же типажи называть миксинами несколько некорректно.
Меня бы больше интересовал реальный пример, когда декораторы могут упростить работу. Ибо пример в статье сильно надуманный. Есть конечно задачи, при которых динамическое добавление функционала может оказаться полезным, но не обязательным.
Без описания примеров, где может пригодиться этот паттерн, реальных примеров, где декоратор упрощает жизнь, ценность этой статьи снижается до минимума.
Вот здесь не соглашусь. Я описал реализацию существующего шаблона проектирования. Его предназначение и применение уже описано до меня. Если бы речь шла о новом шаблоне, тогда да. Здесь речь только о динамическом декорировании вместе с ее реализацией.
Ну это сильно сложное, и наверное неправильное использование декоратора в РНР. Як конечно (слава Богу) не РНР-шник, и как там с интроспекцией не знаю, но РНР ведь динамически типизованный, и там все вообще просто должно быть — как в Питоне. А в Питоне декорация — проще некуда.
Реализация шаблона проектирования декоратор на PHP