Dúvida de implementação em JAVA do Padrão Decorator

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");