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:
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:
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:
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()); |
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.