Decorator
Definição
O padrão Decorator permite incluir novos comportamentos a um objeto sem alterar seu código original. Para isso, ele envolve o objeto com outras classes que estendem suas funcionalidades.
Esse padrão é útil quando você quer adicionar funcionalidades de maneira gradual, sem precisar alterar ou criar várias versões diferentes da mesma classe.
Por que é importante
O Decorator permite modificar o comportamento de objetos de forma controlada, sem usar herança e sem modificar o código existente. Isso torna o sistema mais flexível e mais fácil de manter.
É uma boa escolha quando você precisa aplicar recursos como autenticação, formatação, compressão, registro de logs ou criptografia em diferentes momentos, sem acoplar essas funcionalidades diretamente na classe principal.
Exemplo prático (Python)
Vamos supor que temos uma classe que envia mensagens, e queremos acrescentar assinatura e criptografia no envio — sem alterar a classe original:
from abc import ABC, abstractmethod
# Componente base
class Emissor(ABC):
@abstractmethod
def enviar(self, mensagem):
pass
# Implementação principal
class EmissorSimples(Emissor):
def enviar(self, mensagem):
print(f"Enviando: {mensagem}")
# Decorador base
class EmissorDecorator(Emissor):
def __init__(self, emissor: Emissor):
self.emissor = emissor
# Decorador que adiciona assinatura
class EmissorComAssinatura(EmissorDecorator):
def enviar(self, mensagem):
mensagem_assinada = f"{mensagem} — Assinado"
self.emissor.enviar(mensagem_assinada)
# Decorador que adiciona criptografia
class EmissorComCriptografia(EmissorDecorator):
def enviar(self, mensagem):
mensagem_criptografada = f"***{mensagem}***" # simulação
self.emissor.enviar(mensagem_criptografada)
Veja como aplicar os dois decoradores:
emissor_base = EmissorSimples()
emissor_seguro = EmissorComCriptografia(EmissorComAssinatura(emissor_base))
emissor_seguro.enviar("Mensagem confidencial")
Sem alterar a classe EmissorSimples
, conseguimos estender seu
comportamento usando composição. Também podemos aplicar os decoradores em
diferentes combinações, conforme a necessidade.