Как реализовать шаблон Decorator при использовании многих декораторов - PullRequest
1 голос
/ 03 ноября 2019

Я программирую кофемашину со многими видами кофе. Я предлагаю нормальный кофе, эспрессо, капучино, а также ирландский кофе (виски, кофе, сахар, взбитые сливки), испанский кофе (Cointreau, коньяк, кофе, сахар, взбитые сливки) и итальянский кофе (амаретто, кофе, сахар, взбитые сливки)).

Я планирую добавить больше видов кофе в будущем, поэтому должно быть легко добавить больше сортов кофе без добавления класса для каждого вида.

Мое решение - использовать шаблон декоратора. Однако это оставит меня с таким количеством декораторов, как SugarDecorator, MilkDecorator, WhiskeyDecorator, AmarettoDecorator, WhippedCreamDecorator ...

Как я могу это исправить, не добавляя декоратор для каждой приправы

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Вы можете использовать Шаблон Builder , чтобы добавить больше атрибутов к Кофе, например, добавить сахар и молоко:

Coffee.builder().sugar(true).milk(true).build();

Таким образом, нет никаких дополнительных классов, только атрибуты, но вам нужно build это при создании кофе

Pattern Builder упрощает создание объекта, который можно расширять в независимых направлениях во время построения, а шаблон Decorator позволяет добавлять расширения к функциональностиобъект после строительства

0 голосов
/ 04 ноября 2019

Это не относится к Decorator , похоже, вы хотите добавить дополнительные ингредиенты. Для этой цели вы можете использовать Builder , как предложено @ user7294900.

Шаблон декоратора можно использовать, когда мы хотим добавить новую функциональность к объекту при использовании более раннего объекта в качестве сырья. В общем, почему мы должны беспокоиться о добавленных классах декоратора (когда это необходимо), если они предоставляют требуемые дополнительные функции для существующего объекта. Классы-декораторы не добавляют дополнительную стоимость, так как они необязательно добавляются во время выполнения и имеют тип с оплатой по мере использования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...