Bonjour,

j'étudie actuellement les patrons de conception et j'essaie d'implémenter les exemples du cours en java pour mieux comprendre
par exemple, nous avons étudié le patron composite/composant sur les arbres synthétiques abstraits

et je n'obtient pas le résultat attendu
par exemple, (2+4)/3+8 devrait me donner 10 et moi j'obtiens 17
le Noeud N11 ne se calcule pas (résultat = 0 au lieu de 2)

le problème se situe probablement dans la classe Operation car nous n'avons pas vu le code en cours
jtout ce que l'on avait, c'est le diagramme de classe qui nous indiquait :
- 2 attributs :
private nomOP : String
private mesOp : Map<String,Operation>

3 méthodes :
private Operation()
public getInstance(String) : Operation
public evaluation(int,int) : int

ce que j'ai compris (mais je me trompe peut-être) c'est que Map permets de définir la liste des opérations essentielles (addition, soustraction, multiplication et division)

d'avance merci pour votre aide


interface Noeud
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
public interface Noeud {
	public int evaluation();
}
classe NoeudValeur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
public class NoeudValeur implements Noeud{
 
	private int valeur;
 
	public NoeudValeur(int valeur){
		this.valeur=valeur;
	}
 
	@Override
	public int evaluation() {
		return this.valeur;
	}
 
	public String toString(){
		return ""+this.valeur;
	}
}
classe NoeudBinaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
public class NoeudBinaire implements Noeud {
 
	public Noeud n1;
	public Noeud n2;
	public Operation monOp;
 
	private NoeudBinaire(){}
 
	public NoeudBinaire(Noeud n1, Noeud n2, Operation o){
		this.n1=n1;
		this.n2=n2;
		this.monOp=o;
	}
 
	@Override
	public int evaluation() {
		int v1 = n1.evaluation();
		int v2 = n2.evaluation();
		return monOp.evaluation(v1, v2);
	}
 
	@Override
	public String toString() {
		return ""+this.evaluation();
	}
}
classe Operation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
public class Operation {
 
	private static String nomOP;
	private static Map<String,Operation> mesOP = new HashMap<String,Operation>();
 
	//on créé une Map qui contient les opérations élémentaires
	private Operation(){
		mesOP.put("opAdd", this);
		mesOP.put("opSou", this);
		mesOP.put("opMul", this);
		mesOP.put("opDiv", this);
	}
 
	//constructeur public qui permet de créé un objet Operation
	//appel à la methode getInstance(String) qui créé l'objet à l'aide
	//du constructeur privé
	public Operation(String operation){
		this.getInstance(operation);
		this.nomOP=operation;
	}
 
	//on définit les opérations élémentaires
	public int evaluation(int v1, int v2){
		if(nomOP=="addition")
			return (v1+v2);
		if(nomOP=="soustraction")
			return (v1-v2);
		if(nomOP=="division")
			return (v1/v2);
		if(nomOP=="multiplication")
			return (v1*v2);
		return 0;
	}
 
	//retourne une opération
	public static Operation getInstance(String operation){
		return new Operation();
	}
}
code application
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
NoeudValeur N1111 = new NoeudValeur(2);
NoeudValeur N1112 = new NoeudValeur(4);
Operation opAdd1 = new Operation("addition");
NoeudBinaire N111 = new NoeudBinaire(N1111,N1112,opAdd1);
 
NoeudValeur N112 = new NoeudValeur(3);
Operation opDiv1 = new Operation("division");
NoeudBinaire N11 = new NoeudBinaire(N111,N112,opDiv1);
 
NoeudValeur N12 = new NoeudValeur(8);
Operation opAdd2 = new Operation("addition");
NoeudBinaire N1 = new NoeudBinaire(N11,N12,opAdd2);