Padrão Decorator com classes
Em sistemas de e-commerce ou cardápios digitais, itens como café, pizza ou hambúrguer têm variações que alteram preço e descrição sem modificar a base. Usar herança direta para cada combinação gera uma explosão de classes. O padrão Decorator resolve isso ao permitir empilhar ingredientes dinamicamente, mantendo o código flexível e extensível.
O PROBLEMA
Implemente sistema de café com Decorator: Cafe, ComLeite, ComAcucar, ComChantilly. Encadeáveis.
EXEMPLO
const cafe = new ComChantilly(new ComLeite(new Cafe())); cafe.descricao() → "Café, Leite, Chantilly" cafe.preco() → R$8.50
SOBRE O CONCEITO
O Decorator pattern é um padrão estrutural que permite adicionar responsabilidades a um objeto sem alterar sua classe. Neste exercício, cada decorador (como ComLeite) recebe uma instância de Cafe (ou outro decorador) via construtor, chama super() para delegar e estende o comportamento nos métodos descricao() e preco(). O erro comum é não encadear os decoradores: ao criar new ComLeite(new Cafe()), o decorador deve armazenar o objeto base (com this.cafe = cafe ou via super(cafe) se herdando de Cafe). Outro erro é o preço não acumular: no método preco(), é preciso somar o preço do componente base (obtido com super.preco() ou método do objeto armazenado) com o adicional. Se isso não for feito, ao chamar preco() num decorador aninhado, o valor retornado será apenas o do decorador mais externo.
RESOLUÇÃO