Tópico 12 - Decorator

Tópico 12 - Decorator

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Motivação

Quando funcionalidades extras são opcionais, a herança pode gerar uma explosão de subclasses.

O padrão Decorator resolve isso com composição em camadas sem alterar a interface do cliente.

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Problema

Imagine um sistema de biblioteca que apenas notifica via e-mail.

O que acontece quando queremos adicionar notificações por SMS ou Slack?

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Conceito principal

  • Decorator é um padrão estrutural
  • Ele preserva a interface base
  • Novos comportamentos envolvem o objeto original
  • Cada camada delega e adiciona algo extra
  • O cliente continua usando o mesmo contrato
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Como funciona

  • Existe um componente base
  • O decorador também implementa o mesmo contrato
  • Ele guarda outro componente internamente
  • Recebe a chamada, delega e acrescenta comportamento
  • Várias camadas podem ser empilhadas
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Estrutura / Componentes

  • Component define a interface comum
  • ConcreteComponent entrega o comportamento base
  • Decorator Base encapsula outro componente
  • ConcreteDecorator adiciona nova responsabilidade
  • Cliente monta a pilha conforme a necessidade
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Exemplo conceitual

  • Sistema de notificações para uma universidade
  • E-mail é o comportamento mínimo
  • SMS pode ser uma camada opcional
  • Slack pode ser outra camada opcional
  • O cliente combina os canais sem novas subclasses
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Código: contrato e componente base

interface Notificador {
    void enviar(String mensagem);
}

class EmailNotificador implements Notificador {
    public void enviar(String mensagem) {
        System.out.println("E-mail enviado: " + mensagem);
    }
}
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Código: decorador base

abstract class NotificadorDecorator implements Notificador {
    protected Notificador wrappee;

    public NotificadorDecorator(Notificador wrappee) {
        this.wrappee = wrappee;
    }

    public void enviar(String mensagem) {
        wrappee.enviar(mensagem);
    }
}
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Código: decorador concreto

class SmsDecorator extends NotificadorDecorator {
    public SmsDecorator(Notificador wrappee) {
        super(wrappee);
    }

    public void enviar(String mensagem) {
        super.enviar(mensagem);
        System.out.println("SMS enviado: " + mensagem);
    }
}
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Quando usar

  • Há responsabilidades opcionais
  • As combinações variam por contexto
  • Herança geraria muitas subclasses
  • O comportamento deve mudar em execução
  • O cliente deve manter o mesmo contrato
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Quando não usar

  • A funcionalidade extra é fixa para todos
  • A ordem das camadas é muito sensível
  • O número de decoradores ficaria confuso
  • Uma composição mais simples já basta
  • O comportamento deveria estar no componente base
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Vantagens

  • Evita explosão de subclasses
  • Favorece composição sobre herança
  • Permite combinar responsabilidades livremente
  • Mantém o cliente desacoplado das variações
  • Facilita extensão sem alterar classes prontas
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 12 - Decorator

Desvantagens

  • Aumenta o número de classes pequenas
  • Pode dificultar rastrear a execução
  • Ordem dos decoradores pode importar
  • Configuração inicial pode ficar verbosa
  • Pilhas profundas exigem mais cuidado
Design Patterns - Professor Ramon Venson - SATC 2026.1