Padrão Observer com classes
Em sistemas reais, como plataformas de e-commerce, mudanças no estoque precisam notificar múltiplos serviços (e-mail, SMS, painel) sem que o estoque precise conhecer cada um. O padrão Observer resolve isso: um objeto central (EventEmitter) gerencia uma lista de ouvintes e os notifica quando algo acontece, permitindo adicionar ou remover alertas sem alterar o código do estoque.
O PROBLEMA
Implemente Observer com classes: EventEmitter, PainelEstoque, AlertaEmail e AlertaSMS.
EXEMPLO
const estoque = new PainelEstoque();
estoque.emit("baixo", {produto:"TV"}) → alertas disparadosSOBRE O CONCEITO
A implementação usa herança com class Estoque extends EventEmitter. O EventEmitter mantém um Map onde cada chave é o nome do evento e o valor é um array de funções callback. Erro comum: usar um objeto literal ({ }) em vez de Map para armazenar eventos — com objeto, as chaves são sempre strings, enquanto Map aceita qualquer tipo e tem métodos como set/get mais semanticos. Outro erro: esquecer de chamar super() no construtor da classe filha, o que impede a inicialização correta do EventEmitter. As classes AlertaEmail e AlertaSMS estendem EventEmitter e registram seus próprios ouvintes no estoque via estoque.on('baixo', callback).
RESOLUÇÃO