import java.util.LinkedHashSet; import java.util.Objects; /** feuille du motif composite */ public class Chef extends Person { private final LinkedHashSet subalternes; // Attributs pour mémoriser les résultats private Integer bestPartyMemo = null; private Integer bestPartyWithoutMeMemo = null; /** constructeur * * @param n fun factor */ public Chef(int n) { super(n); this.subalternes = new LinkedHashSet<>(); } /** * Ajoute un subalterne au chef * * @param p la personne à ajouter * @return true si le subalterne a été ajouté, false sinon */ public boolean addSubalterne(Person p) { return subalternes.add(Objects.requireNonNull(p)); } /** * La meilleure fête avec moi, c'est la meilleure fête sans mes subalternes pour eux plus moi. * * @return retourne la valeur de la meilleure fête en invitant seulement les gens dont cette personne est le ou la supérieure hiérarchique, mais pas elle. */ @Override public int bestPartyWithoutMe() { // Vérifie si la valeur est déjà calculée if (this.bestPartyWithoutMeMemo == null) { int sum = 0; for (Person subalterne : subalternes) { sum += subalterne.bestParty(); // Appelle uniquement bestParty(), qui est déjà mémorisé } this.bestPartyWithoutMeMemo = sum; // Mémorise le résultat } return this.bestPartyWithoutMeMemo; } /** * La meilleure fête est soit sans moi (c'est l'union des meilleures fêtes de mes subalternes), * soit c'est la meilleure fête avec moi. * * @return la valeur de la meilleure fête en invitant seulement les gens dont cette personne est le ou la supérieure hiérarchique (peut-être avec elle). */ @Override public int bestParty() { // Vérifie si la valeur est déjà calculée if (this.bestPartyMemo == null) { int withMe = getFunFactor(); for (Person subalterne : subalternes) { withMe += subalterne.bestPartyWithoutMe(); // Inclut uniquement bestPartyWithoutMe(), déjà mémorisé } int withoutMe = bestPartyWithoutMe(); // Utilise la version mémorisée this.bestPartyMemo = Math.max(withMe, withoutMe); // Mémorise le meilleur résultat } return this.bestPartyMemo; } }