Pattern decorator

Fermé
trailer91230 Messages postés 134 Date d'inscription jeudi 5 août 2010 Statut Membre Dernière intervention 20 mai 2016 - Modifié par KX le 22/05/2015 à 14:39
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 22 mai 2015 à 15:04
Bonjour,
Je débute en Java à l'aide du site OpenClassrooms, et j'arrive à un moment où je bloque sur une notion qu'est le pattern strategy decorator.
Voilà le code :

public abstract class Patisserie {
  public abstract String preparer(); 
}
public class Gateau extends Patisserie{
  public String preparer() {
    return "Je suis un gâteau et je suis constitué des éléments suivants. \n";
  }
}
public abstract class Couche extends Patisserie{
  protected Patisserie pat;
  protected String nom;

  public Couche(Patisserie p){
    pat = p;
  }

  public String preparer() {
    String str = pat.preparer();
    return str + nom;
  }
}
public class CoucheChocolat extends Couche{
  public CoucheChocolat(Patisserie p) {
    super(p);
    this.nom = "\t- Une couche de chocolat.\n";
  }
}
public class CoucheBiscuit extends Couche {
  public CoucheBiscuit(Patisserie p) {
    super(p);
    this.nom = "\t- Une couche de biscuit.\n";
  }
}
public class Main{
  public static void main(String[] args){
    Patisserie pat = new CoucheChocolat(
                       new CoucheCaramel(
                         new CoucheBiscuit(
                           new CoucheChocolat(
                             new Gateau()))));
    System.out.println(pat.preparer());
  }
}

Je pense avoir compris l'ensemble du code là où je bloque par contre c'est au niveau de la classe Couche, dans la méthode préparer(), je ne comprends pas la nécessité de de re-envoyer : String str = pat.preparer();

Quand je la supprime, ça se bloque à "Je suis une couche de chocolatee" donc je comprends par là qu'elle sert à remonter l'ensemble de Classe, mais je n'arrive pas à comprendre la logique de la chose, ce qui se passe concrètement en re-envoyant cette méthode...

Voilà j'espère que je me suis bien exprimé ^^
Cordialement.

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
22 mai 2015 à 15:04
Bonjour,

Je ne suis pas convaincu du réel intérêt de ce design pattern, sauf dans des cas très spécifique, d'ailleurs l'exemple choisi me parait mal adapté, Couche extends Patisserie c'est un peu maladroit comme conception...

"je ne comprends pas la nécessité de de re-envoyer : String str = pat.preparer();"
Tout l'intérêt est là, c'est de pouvoir être cumulatif.

Mais il y a une alternative - meilleur à mon sens - c'est de ne pas surcharger le String nom, mais plutôt l'intégrer directement dans la méthode preparer.

public abstract class Patisserie {
    public abstract String preparer();
}
public class Gateau extends Patisserie {
    public String preparer() {
        return "Je suis un gâteau et je suis constitué des éléments suivants :";
    }
}
public class Couche extends Patisserie {
    private final Patisserie pat;
    private final String nom;

    public Couche(Patisserie p, String nom) {
        pat = p;
        this.nom = nom;
    }

    @Override
    public String preparer() {
        return pat.preparer() + "\n\t- " + nom;
    }
}
public class Main {
    public static void main(String[] args) {
        Patisserie pat = new Couche(new Couche(new Couche(new Couche(
            new Gateau(), "chocolat"), "biscuit"), "caramel"), "chocolat");
        System.out.println(pat.preparer());
    }
}

Quitte à avoir éventuellement des classes "de raccourci" :

public class CoucheChocolat extends Couche {
    public CoucheChocolat(Patisserie p) {
        super(p, "chocolat");
    }    
}
public class Main {
    public static void main(String[] args) {
        Patisserie pat = new CoucheChocolat(new CoucheCaramel(
            new CoucheBiscuit(new CoucheChocolat(new Gateau()))));
        System.out.println(pat.preparer());
    }
}
0