Шаблон проектирования: Декоратор (примеры TypeScript)
Шаблон «Композитный» позволяет создавать иерархию объектов, в которой как листовые, так и составные объекты обрабатываются одинаково. В этом примере мы создадим простое представление структуры каталогов.
Вот объяснение шаблона проектирования «Декоратор» вместе с простым примером TypeScript:
// Component interface interface Coffee { cost(): number; getDescription(): string; } // Concrete Component class BasicCoffee implements Coffee { cost(): number { return 2; } getDescription(): string { return "Basic Coffee"; } } // Decorator abstract class CoffeeDecorator implements Coffee { constructor(private coffee: Coffee) {} cost(): number { return this.coffee.cost(); } getDescription(): string { return this.coffee.getDescription(); } } // Concrete Decorators class MilkDecorator extends CoffeeDecorator { cost(): number { return super.cost() + 1; } getDescription(): string { return super.getDescription() + ", Milk"; } } class SugarDecorator extends CoffeeDecorator { cost(): number { return super.cost() + 0.5; } getDescription(): string { return super.getDescription() + ", Sugar"; } } // Client code const basicCoffee = new BasicCoffee(); const coffeeWithMilk = new MilkDecorator(basicCoffee); const coffeeWithMilkAndSugar = new SugarDecorator(coffeeWithMilk); console.log(`Order: ${coffeeWithMilkAndSugar.getDescription()}`); console.log(`Cost: $${coffeeWithMilkAndSugar.cost()}`);
В этом примере:
Coffee
— интерфейс компонента.BasicCoffee
представляет собой конкретный компонент, представляющий основу кофе.CoffeeDecorator
— это абстрактный класс-декоратор, который добавляет возможность обертывать другие типы кофе дополнительными функциями.MilkDecorator
иSugarDecorator
— бетонные декораторы, добавляющие в кофе молоко и сахар соответственно.- Клиентский код может создавать различные комбинации кофе, обертывая базовый кофе разными декораторами.
Шаблон проектирования «Декоратор» обеспечивает гибкое и динамическое расширение поведения объекта, упрощая добавление или удаление функциональных возможностей по мере необходимости.