Estou com dúvidas em relação a implementação do Design Pattern Decorator, pois cada exemplo que pude ver na literatura, a implementação me parece um pouco diferente.
Seguindo essa arquitetura encontrada também na wiklpédia, deixo o meu codigo abaixo com a devida referencia as classes conceituais do padrão mais a classe com a “Main” que testa o Decorator.
Percebam no código abaixo que a “Concrete Decorator” - Classe RUM - retorna um valor e chama “super.algumMetodo()”. Funcionou legal e conseguir decorar o Objeto Café com “RUM”!
A questão é, meu código segue esse padrão? Gostariam de fazer alguma ressalva?
Percebi quem alguns autores utilizam interfaces ao invés de classes abstratas e decoram o objeto na classe “BebidaDecorator” , eu já faço o uso da palavra reservada “Super” na classe “RUM” por exemplo e em qualquer classe que herda de BebidaDecorator - “Concrete Decorator”.
Basta ver essa implementação diferente da minha para se ter idéia.
https://brizeno.wordpress.com/category/padroes-de-projeto/decorator/
Obrigado.
// Essa classe é o Componente. Poderia ser interface mas a deixei como Abstrata!
public abstract class Bebida {
public abstract String getDescricao();
public abstract float getCusto();
public abstract float getCaloria();
}
// Essa classe é o Decorador e herda da abstract class "Bebida"
public class BebidaDecorator extends Bebida {
Bebida bebida;
public BebidaDecorator(Bebida bebida) {
this.bebida = bebida;
}
@Override
public String getDescricao() {
return this.bebida.getDescricao();
}
@Override
public float getCusto() {
return this.bebida.getCusto() ;
}
@Override
public float getCaloria() {
return this.bebida.getCaloria();
}
// Essa classe é o ConcreteDecorator - decora o Componente
public class Rum extends BebidaDecorator {
public Rum(Bebida bebida) {
super(bebida);
}
@Override
public String getDescricao() {
return" Rum " + super.getDescricao() ;
}
@Override
public float getCusto() {
return 5 + super.getCusto();
}
@Override
public float getCaloria() {
return 25 + super.getCaloria();
}
}
// Essa classe é a ConcretComponent
public class Cafe extends Bebida {
public Cafe() {
}
@Override
public String getDescricao() {
return "Café";
}
@Override
public float getCusto() {
return (float) 1.5;
}
@Override
public float getCaloria() {
return 50;
}
}
// Classe Principal para testar o Padrão Decorator
public static void main(String[] args) {
// Inicializa Bebida Base
Bebida bebida = new Cafe();
System.out.println(bebida.getDescricao() + " = R$" + bebida.getCusto() + " com " + bebida.getCaloria() + " Calorias");
//Decorando1
bebida = new Rum(bebida);
System.out.println(bebida.getDescricao() + " = R$" + bebida.getCusto() + " com " + bebida.getCaloria() + " Calorias");