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

Java Discussion :

Patron de conception Décorateur - implémenter en java


Sujet :

Java

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut Patron de conception Décorateur - implémenter en java
    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 décorateur

    dans notre exemple, on enregistre des messages, que l'on décore en les horodatant
    ensuite, j'aimerais pouvoir compter les messages et tous les afficher

    or, j'ai deux problèmes :
    1. il me compte le double de message car j'ai deux instances créées à chaque message (collecteurDeDonnees et CollecteurDeDonneesHorodatees) ; je pourrais diviser par 2 mais çà me semble de la "bidouille"
    2. je n'arrive pas à afficher l'ensemble des messages, seul le premier s'affiche

    d'avance merci pour votre aide

    classe CollecteurDeDonnees
    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
     
    public class CollecteurDeDonnees {
     
    	private static int nbMessageEnregistres = 0;
    	private String message;
    	private static ArrayList<CollecteurDeDonnees> listeMessages = new ArrayList<CollecteurDeDonnees>();
     
    	public CollecteurDeDonnees(){
    		nbMessageEnregistres+=1;
    		listeMessages.add(this);
    	}
     
    	public void enregistre(String message){
    		this.message=message;
    	}
     
    	public int getNbMessagesEnregistres(){
    		return nbMessageEnregistres;
    	}
     
    	public String getMessagesEnregistres(){
    		for(CollecteurDeDonnees c : listeMessages){
    			return c.toString();
    		}
    		return "";
    	}
     
    	public String toString(){
    		return message;
    	}
    }
    classe CollecteurDeDonneesHorodatees
    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
     
    public class CollecteurDeDonneesHorodatees extends CollecteurDeDonnees{
     
    	private CollecteurDeDonnees monSimpleCollecteur;
     
    	public CollecteurDeDonneesHorodatees(CollecteurDeDonnees c){
    		this.monSimpleCollecteur=c;
    	}
     
    	@Override
    	public void enregistre(String message){
    		LocalDateTime heure = LocalDateTime.now();
    		heure = heure.truncatedTo(ChronoUnit.SECONDS);
    		String messageHorodateDate = heure.toString()+"-"+message;
    		monSimpleCollecteur.enregistre(messageHorodateDate);
    	}
    }
    application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CollecteurDeDonnees c1 = new CollecteurDeDonnees();
    CollecteurDeDonneesHorodatees cd1 = new CollecteurDeDonneesHorodatees(c1);
    cd1.enregistre("Bonjour");
     
    CollecteurDeDonnees c2 = new CollecteurDeDonnees();
    CollecteurDeDonneesHorodatees cd2 = new CollecteurDeDonneesHorodatees(c2);
    cd2.enregistre("Au revoir");
    System.out.println(cd2.getNbMessagesEnregistres());
    System.out.println(c2.getMessagesEnregistres());

  2. #2
    Nouveau membre du Club Avatar de Runhide
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 35
    Points : 36
    Points
    36
    Par défaut L'héritage et ses rouages
    Si, dans une classe, un constructeur est défini sans commencer par un appel de constructeur, Java insère un appel du constructeur par défaut de la super classe.
    On peut commencer le code d’un constructeur par un appel d’un constructeur de la classe de base : super(…), ou d'un autre constructeur de la classe this(…) alors Java n’ajoute rien.


    Je te laisse déduire pourquoi tu obtiens le double de ce que tu escomptes.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    je ne comprends pas...

  4. #4
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 679
    Points
    1 679
    Par défaut
    Question :
    Quels constructeurs sont réellement créés à la compilation ? Entre ceux que tu décris et ceux qui sont générés par défaut ?

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    j'ai ajouté un affichage console dans chaque constructeur CollecteurDeDonnees et CollecteurDeDonneesHororodatees
    j'obtiens 6 affichages
    le premier constructeur appelé est celui de la classe mère CollecteurDeDonnees (2 fois visiblement) puis CollecteurDeDonneesHororodatees (1 fois) et à nouveau CollecteurDeDonnees (2 fois visiblement) puis CollecteurDeDonneesHororodatees (1 fois)

  6. #6
    Nouveau membre du Club Avatar de Runhide
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par OZ1977 Voir le message
    j'ai ajouté un affichage console dans chaque constructeur CollecteurDeDonnees et CollecteurDeDonneesHororodatees
    j'obtiens 6 affichages
    le premier constructeur appelé est celui de la classe mère CollecteurDeDonnees (2 fois visiblement) puis CollecteurDeDonneesHororodatees (1 fois) et à nouveau CollecteurDeDonnees (2 fois visiblement) puis CollecteurDeDonneesHororodatees (1 fois)
    La réponse à ton problème se trouve dans la première réponse que j'ai donnée plus haut.

    Tu as répondu n'avoir rien compris.

    Pourtant cela fait référence à un paradigme Java élémentaire, expliqué dans n'importe quels cours.

    Tu n'as pas bien appris ton cours, et on est pas là pour enseigner.

    Comment veux tu qu'on t'aide si tu ne comprends pas le fonctionnement de l'héritage...

  7. #7
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    si je pense avoir compris
    lorsque j'instancie c1, j'appelle le constructeur CollecteurDeDonnees
    ensuite j'instancie cd1, j'appelle le ConstructeurDeDonneesHorodatees qui lui même commence par appeler le constructeur de la classe mère CollecteurDeDonnees

    Donc au final, j'ai appelé 2 fois le constructeur CollecteurDeDonnees et une fois le constructeur CollecteurDeDonneesHorodatees

    ce que je ne comprends pas c'est comment empêcher que le constructeur super() soit appelé dans le constructeur de ma classe fille
    tu me dis qu'il faut que j'appelle un autre constructeur de ma classe fille... c'est là que je ne comprends pas ce que je dois faire

  8. #8
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par OZ1977 Voir le message
    si je pense avoir compris
    [...]
    ce que je ne comprends pas c'est comment empêcher que le constructeur super() soit appelé dans le constructeur de ma classe fille
    tu me dis qu'il faut que j'appelle un autre constructeur de ma classe fille... c'est là que je ne comprends pas ce que je dois faire
    Non, tu n'as pas compris.
    Le constructeur d'une classe dérivée doit appeler un constructeur de la classe mère. Ici, c'est à la compilation que le code nécessaire est ajouté.

    Ce qui est bizarre, c'est de dériver une classe (CollecteurDeDonneesHorodatees) et de lui déléguer une instance de sa classe mère (CollecteurDeDonnees). En général, on fait l'un ou l'autre.

    Pour ton point 2,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(c2.getMessagesEnregistres());
    affiche un seul message. Normal, vu que la méthode retourne un seul message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public String getMessagesEnregistres(){        for(CollecteurDeDonnees c : listeMessages){
                return c.toString();
            }
            return ""; }
    Si tu veux qu'elle retourne une liste de message, il faut faire autrement.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/02/2019, 14h44
  2. [Décorateur] Tutoriel vidéo pour apprendre à mettre en place le patron de conception : Décorateur
    Par Mickael Baron dans le forum Design Patterns
    Réponses: 0
    Dernier message: 05/09/2016, 11h58
  3. Réponses: 2
    Dernier message: 27/03/2014, 11h25
  4. Patron de conception Décorateur
    Par gstratege dans le forum Général Java
    Réponses: 2
    Dernier message: 17/11/2013, 20h55
  5. Réponses: 7
    Dernier message: 09/10/2013, 18h35

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