import java.util.LinkedHashSet; import java.util.Objects; import java.util.*; /** feuille du motif composite */ public class Chef extends Person { private List listeSubalterne; private int[] listeFun = {-1, -1, -1}; // 0 best, 1 avec, 2 sans public boolean addSubalterne(Person p){ return this.listeSubalterne.add(p); } /** constructeur * * @param n fun factor * */ public Chef(int n){ super(n); this.listeSubalterne = new ArrayList<>(); } /** * 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. * */ public int bestPartyWithoutMe(){ if (this.listeFun[0] < 0){ int fun = 0; for (Person invitee : this.listeSubalterne){ fun += invitee.bestParty(); } this.listeFun[0] = fun; } return this.listeFun[0]; } /** * 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. * */ private int bestPartyWithMe(){ if (this.listeFun[1] < 0){ int fun = this.getFunFactor(); for (Person invitee : this.listeSubalterne){ fun += invitee.bestPartyWithoutMe(); } this.listeFun[1] = fun; } return this.listeFun[1]; } /** * 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). * */ public int bestParty(){ return Math.max(this.bestPartyWithMe(), this.bestPartyWithoutMe()); } }