IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Pattern mediator, problème d'empilement


Sujet :

avec Java

  1. #1
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut Pattern mediator, problème d'empilement
    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

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    Points : 136
    Points
    136
    Par défaut
    J'ai essayer ton programme ... il fonctionne très bien
    Juste une remarque :
    Pour la déclaration de de fl utilise un LinkedHashSet à la place de ArrayList . Ca t'évite les doublons éventuels.
    Par exemple...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LinkedHashSet <Colleague> fl = new LinkedHashSet<Colleague>();
    Ce qui te permet alors de simplifier ton code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(!population.get(pos).equals(g) && fl.add(population.get(pos))){
    	//On ajoute au carnet d'adresses
    	j++;
    	System.out.println(g.getName()+" a pour amis "+population.get(pos).getName());
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 11/07/2014, 19h36
  2. Problème Design Pattern : Help
    Par donkeyquote dans le forum C++
    Réponses: 5
    Dernier message: 14/01/2008, 09h54
  3. [Patterns]Séparation IHM <-> Noyau : Problême de progress bar ?
    Par Muetdhiver dans le forum Design Patterns
    Réponses: 8
    Dernier message: 18/09/2007, 22h28
  4. Problème d'accessibilité avec le design patterns MVC
    Par radical_bombtracks dans le forum JSF
    Réponses: 5
    Dernier message: 24/07/2007, 13h15
  5. Réponses: 5
    Dernier message: 10/05/2007, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo