Этот вопрос был задан уже здесь, но вместо ответа на конкретный вопрос были приведены описания того, как работает шаблон декоратора. Я хотел бы снова спросить об этом, потому что ответ не сразу ясен для меня, просто прочитав, как работает узор декоратора (я прочитал статью в википедии и раздел в главе "Первые образцы дизайна" ).
В принципе, я хочу знать, почему должен быть создан абстрактный класс декоратора, который реализует (или расширяет) некоторый интерфейс (или абстрактный класс). Почему не все новые "украшенные классы" просто реализуют (или расширяют) базовый абстрактный объект (вместо расширения абстрактного класса декоратора)?
Чтобы сделать это более конкретным, я воспользуюсь примером из книги шаблонов дизайна, посвященной кофейным напиткам:
- Существует абстрактный класс компонентов, называемый
Beverage
- Простые типы напитков, такие как
HouseBlend
, просто расширяютBeverage
- Чтобы украсить напиток, создается абстрактный класс
CondimentDecorator
, который расширяетBeverage
и имеет экземплярBeverage
- Предположим, что мы хотим добавить приправу "молоко", создается класс
Milk
, который расширяетCondimentDecorator
Я хотел бы понять, почему нам нужен класс CondimentDecorator
и почему класс Milk
не смог просто расширить сам класс Beverage
и был передан экземпляр Beverage
в его конструкторе.
Надеюсь, это ясно... Если бы я просто не хотел знать , почему для этого шаблона необходим абстрактный класс декоратора? Спасибо.
Изменить: я попытался реализовать это, опуская абстрактный класс декоратора и, похоже, все еще работает. Является ли этот абстрактный класс представленным во всех описаниях этого шаблона просто потому, что он предоставляет стандартный интерфейс для всех новых украшенных классов?