Decorando objetos Java: uma introdução ao padrão Decorator
O padrão de projeto Decorator é uma técnica de design que permite adicionar comportamento a um objeto existente em tempo de execução, sem afetar a estrutura subjacente do objeto. O padrão Decorator é comumente usado quando se deseja estender a funcionalidade de um objeto sem criar subclasses adicionais ou alterar seu comportamento original.
Exemplo de implementação em Java
Vamos considerar um exemplo simples de como usar o padrão Decorator em Java. Digamos que você tenha uma interface
que possua apenas o método Cafe
responsável por retornar o preço do café:custo()
public interface Cafe {
double custo();
}
Temos uma implementação para a interface
, uma classe de café básico que custa R$ 1,00:Cafe
public class CafeBasico implements Cafe {
@Override
public double custo() {
return 1.0;
}
}
Agora, se quisermos adicionar novos comportamentos ao objeto
, podemos usar uma classe decoradora. Vamos criar uma nova classe decoradora chamada de CafeBasico
que adiciona leite ao café:CafeComLeiteDecorator
public class CafeComLeiteDecorator implements Cafe {
private Cafe cafe;
public CafeComLeiteDecorator(Cafe cafe) {
this.cafe = cafe;
}
@Override
public double custo() {
return cafe.custo() + 0.5;
}
}
Observe que a classe
implementa a mesma interface CafeComLeiteDecorator
que a classe Cafe
. Isso significa que a classe CafeBasico
pode ser usada como um objeto CafeComLeiteDecorator
em outros lugares do código.Cafe
A classe
contém um objeto CafeComLeiteDecorator
que é passado como um parâmetro em seu construtor. O método Cafe
da classe custo()
adiciona o custo do leite R$ 0,50 ao custo do café original, que é retornado pelo método CafeComLeiteDecorator
do objeto Cafe.custo()
Agora, podemos criar um novo objeto de café decorado com leite usando a seguinte linha de código:
Cafe cafeComLeite = new CafeComLeiteDecorator(new CafeBasico());
A variável
é um objeto cafeComLeite
decorado com leite, que pode ser usado como um objeto Cafe
em outros lugares do código. Podemos, então, chamar o método Cafe
do objeto custo()
para obter o preço total do café com leite:cafeComLeite
double custo = cafeComLeite.custo();
System.out.println("Café com leite custa: R$ " + custo);
O resultado será:
Café com leite custa: R$ 1.5
Conclusão
O padrão de projeto Decorator é uma técnica poderosa para adicionar comportamento a objetos existentes em tempo de execução. Ele permite que você adicione novos comportamentos sem afetar a estrutura subjacente do objeto, tornando-o uma ferramenta valiosa para a criação de código flexível e extensível.