C'est bon, problème résolu, la version de ce post est corrigée pour info.

Bonjour,

J'essaye d'illustrer le pattern mediator par un exemple en Java.

Je génère une population d'amis qui ont un carnet d'adresses. On imagine qu'un des individu veut organiser un évènement et appel ses amis (ceux de son carnet) qui a leur tour appellent leurs amis et ainsi de suite.

Je veux montrer que si on laisse faire, des personnes seront appellées un grand nombre de fois, là où une suffirait (ce que fera le mediateur).

Pas de problème pour générer la population, les carnet d'adresses. Le problème c'est lorsqu'ils passent leurs appels, le programme s'interromp. Apparement, s'il y a trop d'appellants, ça sature:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
 
import java.util.Random;
import java.util.ArrayList;
 
class Main{
	 public static void main(String[] args){
			Random r = new Random();
 
			System.out.println("Séquence de 10 collègues sans médiateur");
			ArrayList<Colleague> population;
			population  = new ArrayList<Colleague>();
			Mediator m = new Mediator();
 
			//Constitution de la population
			int i;
			for(i=0; i<10; ++i){
				  population.add(new Colleague(String.valueOf(i), m));
			}
 
			//Constitution des carnets d'adresse
			for(Colleague g: population){
				 int nbamis = r.nextInt(4)+1;
 
				 ArrayList<Colleague> fl = new ArrayList();
				 //On prend de 0 à 10 amis dans la liste pour constituer le carnet d'adresse
				 int j = 0;
				 while(j<nbamis){
						int pos = r.nextInt(10);
						if(!population.get(pos).equals(g) && !fl.contains(population.get(pos))){
							 //On ajoute au carnet d'adresses
							 fl.add(population.get(pos));
							 j++;
							 System.out.println(g.getName()+" a pour amis "+population.get(pos).getName());
						}
				 }
				 g.setFriendList(fl);
			}
 
 
			System.out.println("Carnet d'amis générés, passage de tous les appels a partir de la premiere personne");
 
			population.get(0).giveAllCalls(false, population.get(0));
 
			System.out.println("------------------------------------------");
			System.out.println("Résultat sans médiateur:");
 
			for(Colleague g: population){
				 System.out.println(g.getName()+" a été appellé: "+g.getCalled()+" fois.");
 
			}
 
	 }
}
Les collègues:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
import java.util.ArrayList;
 
class Colleague{
	 private ArrayList<Colleague> friendList;
	 private String name;
	 private Mediator m;
	 private int nbCalls;
	 private boolean hasCalled;
 
 
	 public Colleague(String nom, Mediator m){
			name = nom;
			this.friendList = friendList;
			this.m = m;
			nbCalls = 0;
			hasCalled = false;
	 }
 
	 public void setFriendList(ArrayList<Colleague> a){
			friendList = a;
	 }
 
	 public boolean equals(Colleague c){
			if(c.getName() == name)
				 return true;
			return false;
	 }
 
	 public Colleague(String nom, ArrayList friendList){
			name = nom;
			this.friendList = friendList;
			m = null;
	 }
 
	 public int nbCalled(){
			return nbCalls;
	 }
 
	 public void giveAllCalls(boolean mediate, Colleague father){
			if(hasCalled == false){
				 if(!mediate){
                                                hasCalled = true;
						for(Colleague g : friendList){
							 System.out.println("Appelant: "+getName()+"Appelé: "+g.getName());
							 if(!g.equals(father)){
									g.called();
									g.giveAllCalls(false, this);
							 }
						}
				 }else{
						 for(Colleague g : friendList){
							 if(!g.equals(father)){
									m.phone(g);
							 }
						}
				 }
				System.out.println(this.getName()+" finis");
			}
	 }
 
	 public void called(){
			nbCalls++;
	 }
 
	 public int getCalled(){
			return nbCalls;
	 }
 
	 public String getName(){
			return name;
	 }
 
}
Et le médiateur (qui ne sert pas pour le moment):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
class Mediator{
	 public void phone(Colleague receiver){
			if(receiver.nbCalled() != 1){
				 receiver.called();
			}
	 }
}
Si vous pouviez m'éclairer sur la manière d'éviter cet empilement d'appels de fonctions, ça m'aiderais GRANDEMENT

Merci d'avance
Seeme