Шаблон проектирования: Декоратор (примеры 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 — бетонные декораторы, добавляющие в кофе молоко и сахар соответственно.
  • Клиентский код может создавать различные комбинации кофе, обертывая базовый кофе разными декораторами.

Шаблон проектирования «Декоратор» обеспечивает гибкое и динамическое расширение поведения объекта, упрощая добавление или удаление функциональных возможностей по мере необходимости.