O padrão de decorador é um padrão de design poderoso na engenharia de software que permite aos desenvolvedores adicionar novas funcionalidades aos objetos existentes sem modificar seu código original. Esta abordagem é especialmente útil quando você precisa adicionar loging aos métodos de serviço sem alterar seu código fonte, garantindo bases de código limpas e mantendíveis.

Compreender o padrão de decoração

O padrão de decorador envolve criar uma classe de embrulho que implementa a mesma interface que o serviço original. Este representante de embrulho chama para o serviço original, mas adiciona comportamento adicional, como o registro, antes ou depois da execução do método.

Implementação de Registo com o Padrão Decorador

Suponha que você tenha uma interface de serviço:

public interface DataService {
 void fetchData();
}

Você pode criar uma implementação concreta:

public class RealDataService implements DataService {
 @Override
 public void fetchData() {
 // Fetch data from a database or external API
 }
}

Em seguida, crie uma classe de decorador que adiciona loging:

public class LoggingDataServiceDecorator implements DataService {
 private final DataService wrappedService;

 public LoggingDataServiceDecorator(DataService service) {
 this.wrappedService = service;
 }

 @Override
 public void fetchData() {
 System.out.println("Fetching data started.");
 wrappedService.fetchData();
 System.out.println("Fetching data completed.");
 }
}

Usar o Decorador

Para adicionar o registro, instance o decorador com o seu serviço existente:

DataService service = new RealDataService();
DataService loggedService = new LoggingDataServiceDecorator(service);

// Now, calling fetchData will include logging
loggedService.fetchData();

Benefícios do padrão de decoração

  • Melhora a funcionalidade existente sem modificar o código original
  • Promove a reutilização e separação de preocupações de código
  • Facilita a adição de múltiplas camadas de comportamento dinamicamente

O uso do padrão de decorador para registro é uma solução elegante que mantém o código limpo e adere ao princípio aberto, facilitando a extensão e manutenção de suas aplicações.