Bonjour, le problème est simple:
Un animal domestique se trouve devant un objet (au sens large). Soit cet objet est comestible et l’animal le mange, soit l’objet ne l’est pas et l’animal joue avec. Quelle est la meilleure manière de modéliser cela sachant qu’il existe des dizaines d’objets possibles (ici, on simplifie avec deux cas possibles).
J’ai deux modèles en tête
public class Main {
public static void main(String[] args) {
Animal chat = new Animal();
// Objet surprise : soit de la nourriture, soit un jouet
Object surprise = Surprise.getSurprise();
if (surprise instanceof Nourriture) {
chat.manger(surprise);
}
else if (surprise instanceof Jouet) {
chat.jouer(surprise);
}
}
}
Le souci de ce modèle c’est que il y a un if
par objet possible, donc une dizaine de if
pour une dizaine d’objects. Si on ajoute un nouveau type d’objet, on ajoute une nouveau if
. L’avantage c’est que le code est logique: chat.manger(surprise);
se lit Le chat mange la surprise.
public class Main {
public static void main(String[] args) {
Animal chat = new Animal();
// Objet surprise : soit de la nourriture, soit un jouet
Object surprise = Surprise.getSurprise();
// L'objet est activé par le chat
surprise.activation(chat);
}
}
public class Nourriture implements Activation {
public void activation(Animal animal) {
animal.manger(this);
}
}
public class Jouet implements Activation {
public void activation(Animal animal) {
animal.jouer(this);
}
}
public interface Activation {
public void activation(Animal animal);
}
L’avantage du modèle c’est qu’on évite les dizaines de if
. De plus, si on ajoute un nouveau type d’objet, il suffit de le faire hériter de Activation. Le souci c’est qu’on perd de la logique dans le code : surprise.activation(chat);
se lit la surprise active un chat
, bref cette instruction ne veut rien dire.