From 9dcffb88563d874600dbf8b9bfbc734cb0ab49c3 Mon Sep 17 00:00:00 2001 From: Minht <minh-tue.tran.etu@univ-lille.fr> Date: Sun, 24 Nov 2024 23:39:45 +0100 Subject: [PATCH] done --- .../univlille/iut/r304/tp3/q1/Observable.java | 19 ++++---- .../fr/univlille/iut/r304/tp3/q2/Main.java | 12 +++-- .../univlille/iut/r304/tp3/q2/Objectif.java | 43 +++++++++-------- .../iut/r304/tp3/q2/ObjectifLettre.java | 21 ++++++++ .../iut/r304/tp3/q2/ObjectifLigne.java | 16 +++++++ .../fr/univlille/iut/r304/tp3/q2/Text.java | 16 +++---- .../iut/r304/tp3/q3/ConnectableProperty.java | 22 ++++++++- .../iut/r304/tp3/q3/ObservableProperty.java | 16 +++++-- .../fr/univlille/iut/r304/tp3/q4/Devise.java | 48 +++++++++++++++++++ .../fr/univlille/iut/r304/tp3/q4/Main.java | 28 +++++++++++ 10 files changed, 192 insertions(+), 49 deletions(-) create mode 100644 src/main/java/fr/univlille/iut/r304/tp3/q2/ObjectifLettre.java create mode 100644 src/main/java/fr/univlille/iut/r304/tp3/q2/ObjectifLigne.java create mode 100644 src/main/java/fr/univlille/iut/r304/tp3/q4/Devise.java create mode 100644 src/main/java/fr/univlille/iut/r304/tp3/q4/Main.java diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q1/Observable.java b/src/main/java/fr/univlille/iut/r304/tp3/q1/Observable.java index 86b4182..ab01f57 100644 --- a/src/main/java/fr/univlille/iut/r304/tp3/q1/Observable.java +++ b/src/main/java/fr/univlille/iut/r304/tp3/q1/Observable.java @@ -2,32 +2,33 @@ package fr.univlille.iut.r304.tp3.q1; import java.util.ArrayList; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.List; public abstract class Observable { - private List<Observer> observers = new ArrayList<>(); - + protected ConcurrentLinkedQueue<Observer> observers = new ConcurrentLinkedQueue<>(); protected void notifyObservers() { - List<Observer> Observers = new ArrayList<>(observers); - for (Observer obs : Observers) { - obs.update(this); + for (Observer ob: observers){ + ob.update(this); } } protected void notifyObservers(Object data) { - List<Observer> Observers = new ArrayList<>(observers); - for (Observer obs : Observers) { - obs.update(this, data); + for (Observer ob : observers){ + ob.update(this,data); } } public void attach(Observer observer) { + observers.add(observer); + } public void detach(Observer observer) { + observers.remove(observer); + } } diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q2/Main.java b/src/main/java/fr/univlille/iut/r304/tp3/q2/Main.java index b81b0c2..5338514 100644 --- a/src/main/java/fr/univlille/iut/r304/tp3/q2/Main.java +++ b/src/main/java/fr/univlille/iut/r304/tp3/q2/Main.java @@ -7,12 +7,14 @@ Main { Text texte = new Text(System.in); // Créer un objectif - Objectif objectif = new Objectif("1", 4); - + Objectif objectifLigne = new ObjectifLigne("1", 14); + Objectif objectifLettre = new ObjectifLettre("2",15,'e'); // Attacher l'objectif comme observateur du texte - texte.attach(objectif); - - // Lancer la saisie + texte.attach(objectifLigne); + texte.attach(objectifLettre); + System.out.println("hello"); texte.lancer(); + + } } diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q2/Objectif.java b/src/main/java/fr/univlille/iut/r304/tp3/q2/Objectif.java index e444041..31894fd 100644 --- a/src/main/java/fr/univlille/iut/r304/tp3/q2/Objectif.java +++ b/src/main/java/fr/univlille/iut/r304/tp3/q2/Objectif.java @@ -3,35 +3,38 @@ package fr.univlille.iut.r304.tp3.q2; import fr.univlille.iut.r304.tp3.q1.Observer; import fr.univlille.iut.r304.tp3.q1.Observable; -public class Objectif implements Observer { - private int nbRestant; - private String nom; +public abstract class Objectif implements Observer { + protected int nbRestant; + protected String nom; + private final String type; - public Objectif(String nom, int nbLignes) { + public Objectif(String nom, int nbRestant, String type) { this.nom = nom; - this.nbRestant = nbLignes; + this.nbRestant = nbRestant+1; + this.type = type; } + @Override public void update(Observable subj) { + if(nbRestant <= 1){ + subj.detach(this); + System.out.println("Objectif " +nom + " -nom de "+ type + "atteint"); + }else{ + System.out.println("Objectif " +nom +" -nom de "+ type + "restant :" + nbRestant); + } + } @Override - public void update(Observable o, Object arg) { - if (arg instanceof String) { - String ligne = (String) arg; - - - if (!ligne.equals("!fin")) { - nbRestant--; - if (nbRestant > 0) { - System.out.println(">>>Objectif " + nom + " - nombre de lignes : encore " + nbRestant + "<<<"); - } else { - System.out.println(">>>Objectif " + nom + " - nombre de lignes atteint<<<"); - System.out.println("Mission accomplie"); - } - } - } + public void update(Observable subj, Object data) { + int dimunition = calculerDimunition((String )data); + nbRestant -= dimunition; + update(subj); } + + + public abstract int calculerDimunition(String texte); + } diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q2/ObjectifLettre.java b/src/main/java/fr/univlille/iut/r304/tp3/q2/ObjectifLettre.java new file mode 100644 index 0000000..2009880 --- /dev/null +++ b/src/main/java/fr/univlille/iut/r304/tp3/q2/ObjectifLettre.java @@ -0,0 +1,21 @@ +package fr.univlille.iut.r304.tp3.q2; + +public class ObjectifLettre extends Objectif{ + char lettre; + + public ObjectifLettre(String nom,int Nbrestant,char lettre){ + super(nom,Nbrestant,""+lettre); + this.lettre = lettre; + } + + @Override + public int calculerDimunition(String texte) { + int compteur = 0; + for(int i = 0; i<texte.length();i++){ + if(texte.charAt(i)==lettre){ + compteur ++; + } + } + return compteur; + } +} diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q2/ObjectifLigne.java b/src/main/java/fr/univlille/iut/r304/tp3/q2/ObjectifLigne.java new file mode 100644 index 0000000..333404a --- /dev/null +++ b/src/main/java/fr/univlille/iut/r304/tp3/q2/ObjectifLigne.java @@ -0,0 +1,16 @@ +package fr.univlille.iut.r304.tp3.q2; + +public class ObjectifLigne extends Objectif{ + + public ObjectifLigne(String n ,int nbr){ + super(n,nbr,"lignes"); + + } + + @Override + public int calculerDimunition(String texte) { + return 1; + } + + +} diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q2/Text.java b/src/main/java/fr/univlille/iut/r304/tp3/q2/Text.java index f5df549..17314b7 100644 --- a/src/main/java/fr/univlille/iut/r304/tp3/q2/Text.java +++ b/src/main/java/fr/univlille/iut/r304/tp3/q2/Text.java @@ -5,7 +5,7 @@ import java.util.Scanner; import fr.univlille.iut.r304.tp3.q1.Observable; public class Text extends Observable { - private Scanner scan; + protected Scanner scan; // Constructeur qui initialise le Scanner public Text(InputStream in) { @@ -14,14 +14,12 @@ public class Text extends Observable { // Méthode pour lancer la saisie de texte public void lancer() { - String ligne; - while (true) { - ligne = scan.nextLine(); // Lecture de l'entrée - notifyObservers(ligne); // Notification des observateurs avec la ligne saisie - if (ligne.equals("!fin")) { - System.out.println("Fin de la saisie."); - break; - } + String text = ""; + + while(!text.equalsIgnoreCase("!fin")){ + notifyObservers(text); + text = scan.next(); } + System.out.println("Fin de la session"); } } diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q3/ConnectableProperty.java b/src/main/java/fr/univlille/iut/r304/tp3/q3/ConnectableProperty.java index ce7269d..7d0d911 100644 --- a/src/main/java/fr/univlille/iut/r304/tp3/q3/ConnectableProperty.java +++ b/src/main/java/fr/univlille/iut/r304/tp3/q3/ConnectableProperty.java @@ -1,14 +1,34 @@ package fr.univlille.iut.r304.tp3.q3; -public class ConnectableProperty extends ObservableProperty { +import fr.univlille.iut.r304.tp3.q1.Observable; +import fr.univlille.iut.r304.tp3.q1.Observer; + +public class ConnectableProperty extends ObservableProperty implements Observer { public void connectTo(ConnectableProperty other) { + other.attach(this); + this.setValue(other.getValue()); } public void biconnectTo(ConnectableProperty other) { + other.attach(this); + this.attach(other); + other.setValue(this.getValue()); } public void unconnectFrom(ConnectableProperty other) { + other.detach(this); + } + @Override + public void update(Observable subj) { + + } + + @Override + public void update(Observable subj, Object data) { + super.setValue(data); + + } } diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q3/ObservableProperty.java b/src/main/java/fr/univlille/iut/r304/tp3/q3/ObservableProperty.java index 4fe250c..fa20e2c 100644 --- a/src/main/java/fr/univlille/iut/r304/tp3/q3/ObservableProperty.java +++ b/src/main/java/fr/univlille/iut/r304/tp3/q3/ObservableProperty.java @@ -1,17 +1,22 @@ package fr.univlille.iut.r304.tp3.q3; +import fr.univlille.iut.r304.tp3.q1.Observable; import fr.univlille.iut.r304.tp3.q1.Observer; -public class ObservableProperty { - +public class ObservableProperty extends Observable { + Object obj; public void setValue(Object i) { + if(obj == i) return; + obj =i; + super.notifyObservers(i); + } public Object getValue() { - return null; + return obj; } - public void attach(Observer observer) { + /*public void attach(Observer observer) { // methode cree pour que les tests compilent sans erreur // n'est pas censée rester une fois que vous avez fini Q2.1 } @@ -19,6 +24,7 @@ public class ObservableProperty { public void detach(Observer observer) { // methode cree pour que les tests compilent sans erreur // n'est pas censée rester une fois que vous avez fini Q2.1 - } + + }*/ } diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q4/Devise.java b/src/main/java/fr/univlille/iut/r304/tp3/q4/Devise.java new file mode 100644 index 0000000..887e14d --- /dev/null +++ b/src/main/java/fr/univlille/iut/r304/tp3/q4/Devise.java @@ -0,0 +1,48 @@ +package fr.univlille.iut.r304.tp3.q4; + +import fr.univlille.iut.r304.tp3.q1.Observable; +import fr.univlille.iut.r304.tp3.q3.ConnectableProperty; + +public class Devise extends ConnectableProperty { + private final String typeDevise; + private final double tauxConversion; + private boolean enCoursDeMiseAJour = false; + + public Devise(double montantInit, String type, double tauxConversion) { + super.setValue(montantInit); + this.typeDevise = type; + this.tauxConversion = tauxConversion; + } + + public String getTypeDevise() { + return typeDevise; + } + + public double getMontant() { + return (double) super.getValue(); + } + + public void setMontant(double m) { + super.setValue(m); + System.out.println("fait setmontant"); + } + + @Override + public void update(Observable subj, Object data) { + if (!enCoursDeMiseAJour && data instanceof Double && subj instanceof Devise) { + try { + enCoursDeMiseAJour = true; // Active le verrou + double autreMontant = (Double) data; + double montantConverti = autreMontant / this.tauxConversion; + super.setValue(montantConverti); // Met à jour la valeur + } finally { + enCoursDeMiseAJour = false; // Libère le verrou + } + } + } + + @Override + public String toString() { + return String.format("%.2f %s", getMontant(), typeDevise); + } +} diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q4/Main.java b/src/main/java/fr/univlille/iut/r304/tp3/q4/Main.java new file mode 100644 index 0000000..bee9138 --- /dev/null +++ b/src/main/java/fr/univlille/iut/r304/tp3/q4/Main.java @@ -0,0 +1,28 @@ +package fr.univlille.iut.r304.tp3.q4; + +public class Main { + public static void main(String[] args) { + // Taux de conversion + double tauxEuroToDollar = 1.11; // 1 € = 1.11 $ + double tauxDollarToEuro = 1 / tauxEuroToDollar; // 1 $ = 0.90 € + + // Création des devises + Devise euros = new Devise(0, "EUR", tauxDollarToEuro); + Devise dollars = new Devise(0, "USD", tauxEuroToDollar); + + // Synchronisation bidirectionnelle + euros.biconnectTo(dollars); + + // Ajout de 20 $ et affichage + System.out.println("Ajout de 20 $"); + dollars.setMontant(20); // Mise à jour des dollars + System.out.println(euros); // Affiche : 18.02 EUR + System.out.println(dollars); // Affiche : 20.00 USD + + // Retrait de 11 € et affichage + System.out.println("Retrait de 11 €"); + euros.setMontant(euros.getMontant() - 11); // Mise à jour des euros + System.out.println(euros); // Affiche : 7.02 EUR + System.out.println(dollars); // Affiche : 7.78 USD + } +} -- GitLab