Случай использования шаблона Decorator для шаблона "Head First: Design Patterns" заставил меня задать этот вопрос. Я попытаюсь записать его:
Это кофейная система с кофе и много приправ вы можете ввести их (за дополнительную плату), вы должны иметь возможность заказать и взимать плату за кофе с любыми приправами, которые пожелает заказчик, и чтобы избежать полного хаоса (например, boolean, чтобы отслеживать приправы). Используется узор декоратора. У нас есть абстрактный напиток класс, каждый тип кофе в качестве конкретных компонентов и каждая приправа как бетонные декораторы, обертывающие напиток, например:
Итак, у нас есть следующий процесс, возвращающий стоимость кофе:
Мой вопрос: почему бы не реализовать это со списками вместо Decorator? У нас может быть список Condiment в каждом напитке и рассчитать стоимость, итерации через Список. Чтобы заказать кофе, нам просто нужно было создать экземпляр его один раз и добавить нужные приправы, избегая таких объявлений, как:
// Using second image example
Beverage beverage = new DarkRoast(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
В дополнение к этому у нас будет больше гибкости для таких операций, как предоставление скидки на кофе, не включая его приправы, как только у нас не будет декораторов, завернувших кофе. Это вопрос, который давно изучен, я знаю, что я что-то упустил или, может быть, у меня что-то не так, поэтому, если у вас есть какие-то мысли по этому поводу, я бы хотел узнать и обсудить его дальше.