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