Polimorfismo e pattern Decorator

di il
6 risposte

Polimorfismo e pattern Decorator

Salve a tutti. Sono alle prese con il pattern decorator che sul momento mi sembrava di aver capito, ma evidentemente non è così.

Il mio dubbio deriva dal fatto che non capisco come faccia a il programma a richiamare una classe piuttosto che un'altra. Mi spiego meglio. Ecco una parte del codice incriminato:

public class TestDecorator3 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Beverage beverage1 = new Espresso();
beverage1 = new Mocha(beverage1);
beverage1 = new Whip(beverage1);
beverage1 = new Soy(beverage1);
System.out.print("prodotto :"+beverage1.getDescription());

}
}

Questo è il risultato :
prodotto :Espresso Mocha Whip Soy

Funziona tutto correttamente, ma la mia domanda forse banale è la seguente:
Perchè invece di partire da Soy che è l'ultima assegnazione che viene fatta a beverage1 il programma parte ad elaborare dalla classe intermedia(Mocha neanche da Espresso). In fondo al termine di queste assegnazioni tipo scatole cinesi(wrapper) non dovremmo ottenere un oggetto "Soy" e quindi richiamare di conseguenza Soy.getDescription()? Dov'è che sbaglio?

Ecco la classe Mocha(Whip, Soy sono fatte pressapoco uguali):

public class Mocha extends CondimentDecorator {

private Beverage beverage;

Mocha(Beverage beverage) {
this.beverage = beverage;
}

@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription()+" Mocha";
}

@Override
double getCost() {
// TODO Auto-generated method stub
return beverage.getCost() + 0.20;
}
}


Mentre il decorator e' fatto così:

public abstract class CondimentDecorator extends Beverage{

public abstract String getDescription();


}

6 Risposte

  • Re: Polimorfismo e pattern Decorator

    andriun ha scritto:


    Questo è il risultato :
    prodotto :Espresso Mocha Whip Soy

    Funziona tutto correttamente, ma la mia domanda forse banale è la seguente:
    Perchè invece di partire da Soy che è l'ultima assegnazione che viene fatta a beverage1 il programma parte ad elaborare dalla classe intermedia(Mocha neanche da Espresso).
    L'oggetto più "esterno" (cioè quello referenziato da beverage1 poco prima del print) è il Soy. È il suo getDescription che viene invocato per primo!
    Ma, se come hai detto sono tutti simili (cambiando solo la dicitura), il suo getDescription è quindi

    return beverage.getDescription()+" Soy";

    pertanto non ci vuole molto a capire che nella stringa finale stampata l'oggetto più esterno è quello indicato più a destra.
  • Re: Polimorfismo e pattern Decorator

    Purtroppo sembra non sia così: mettendo in debug il programma, il primo oggetto richiamato risulta essere "Mocha" non Soy!?! come anch'io mi aspettavo...
  • Re: Polimorfismo e pattern Decorator

    andriun ha scritto:


    Purtroppo sembra non sia così
    Ascolta: metti un System.out.println(getClass()); (ovviamente prima del return) in tutti i vari getDescription e poi mi dici quale è l'output.
  • Re: Polimorfismo e pattern Decorator

    Class Whip
    class Mocha
    class Espresso
    prodotto :Espresso Mocha Whip Soy

    Forse adesso ho capito dove mi confondevo....
    Può essere che la descrizione(che comunque dovrebbe estendersi sempre da sinistra verso destra), sia in effetti composta solo in fase di ritorno; ovvero una volta raggiunto l'ultimo anello della "catena" che in questo caso corrisponde alla classe Espresso?
  • Re: Polimorfismo e pattern Decorator

    andriun ha scritto:


    class Whip
    class Mocha
    class Espresso
    prodotto :Espresso Mocha Whip Soy
    Hai messo il println nel getDescription di Soy? Deve essere il primo invocato, lo ripeto.

    andriun ha scritto:


    Forse adesso ho capito dove mi confondevo....
    Può essere che la descrizione(che comunque dovrebbe estendersi sempre da sinistra verso destra), sia in effetti composta solo in fase di ritorno; ovvero una volta raggiunto l'ultimo anello della "catena" che in questo caso corrisponde alla classe Espresso?
    1) Il getDescription di Soy viene invocato (è quello più esterno assegnato a beverage1 nel main).
    poi
    2) Il beverage in Soy è il Whip, quindi il getDescription di Whip viene invocato.
    poi
    3) Il beverage in Whip è il Mocha, quindi il getDescription di Mocha viene invocato.
    poi
    4) Il beverage in Mocha è il Espresso, quindi il getDescription di Espresso viene invocato. Siccome Espresso deduco non è un "decoratore", non incapsula altro e ritorna solo "Espresso".

    Il Mocha riceve di ritorno "Espresso" e gli accoda " Mocha" = "Espresso Mocha" che viene restituito, ecc.....
  • Re: Polimorfismo e pattern Decorator

    Sì l'ho messo, infatti stampa whip...

    Comunque adesso è tutto più chiaro...abbi pazienza provengo da una programmazione di tipo procedurale e devo farmi ancora l'abitudine/le ossa con questi "giochetti".. grazie ancora comunque...
Devi accedere o registrarti per scrivere nel forum
6 risposte