La maggior parte delle risorse che ho visto a proposito del pattern Decorator sono le seguenti:
interface Tea
{
public double cost();
}
class BasicTea implements Tea
{
public double cost() { return 1.99; }
}
abstract class TeaDecorator implements Tea
{
private Tea base;
public TeaDecorator(Tea tea) { this.base = tea; }
public double cost() { return this.base.cost(); }
}
class TeaWithMilk extends TeaDecorator
{
public TeaWithMilk(Tea tea) { this.base = tea; }
public double cost() { return this.base.cost() + 0.30; }
}
class TeaWithSugar extends TeaDecorator
{
public TeaWithSugar(Tea tea) { this.base = tea; }
public double cost() { return this.base.cost() + 0.10; }
}
decoratedTea = new TeaWithSugar(new TeaWithMilk(new BasicTea()));
Tuttavia, ho notato che il seguente approccio funziona anche - decoratedTea.cost()
restituisce lo stesso valore di cui sopra.
class Tea
{
public double cost() { return 1.99; }
}
abstract class TeaDecorator extends Tea
{
private Tea base;
public TeaDecorator(Tea tea) { this.base = tea; }
public double cost() { return this.base.cost(); }
}
class TeaWithMilk extends TeaDecorator
{
public TeaWithMilk(Tea tea) { this.base = tea; }
public double cost() { return this.base.cost() + 0.30; }
}
class TeaWithSugar extends TeaDecorator
{
public TeaWithSugar(Tea tea) { this.base = tea; }
public double cost() { return this.base.cost() + 0.10; }
}
decoratedTea = new TeaWithSugar(new TeaWithMilk(new Tea()));
C'è qualche problema con questo metodo? Se altrimenti non avrei un'interfaccia per Tea, è necessario aggiungerne uno solo per implementare il pattern Decorator?