Files

70 lines
2.4 KiB
Java
Raw Permalink Normal View History

2024-12-04 17:26:25 +01:00
import java.util.LinkedHashSet;
import java.util.Objects;
/** feuille du motif composite */
public class Chef extends Person {
private final LinkedHashSet<Person> 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;
}
}