diff --git a/README.md b/README.md index a6d91a3c654c8a9e12a4f64377fec7c7c7aec0be..904db213f2c81634ff7fb081c7a04d3b9155e871 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Dans ce TP, vous allez vous familiariser avec le patron de conception observateu D'abord, en implémentant sa structure et son mécanisme. Puis, en utilisant cette couche abstraite pour réaliser un petit programme présentant des objectifs sur des saisies utilisateurs. -## Le patron Observateurs / Observable +## Partie 1 : Le patron Observateurs / Observable La figure suivante vous présente le patron Observateurs (ici « Observer ») / Observable. L’idée est qu’un ou plusieurs observateurs peuvent s’inscrire auprès d’un Observable et être avertis d’évènements qui se produisent sur ce dernier. @@ -30,7 +30,7 @@ classDiagram Observer : +update(Observable, Object) void ``` -**Q1.1** Compléter la classe abstraite Observable de manière à pouvoir disposer du mécanisme Observateur/Observable. +Compléter la classe abstraite Observable de manière à pouvoir disposer du mécanisme Observateur/Observable. Vérifiez la validité de votre implémentation à l'aide des tests fournis. ```java @@ -43,39 +43,43 @@ public abstract class Observable { } ``` -Nous utiliserons ce pattern pour implémenter un (des) analyseur(s) de textes saisis. +## Partie 2 : Application -On souhaite instancier deux règles, qui se mettent à jour à chaque ligne saisie. -Ces deux règles utiliseront les mêmes saisies mais vérifieront des critères différents. - - -Note: Des tests sont fournis dans le projet pour que vous vous assuriez que vos classes fonctionnent comme attendu. -Respectez les noms des packages, classes et méthodes - -**Q1.2** -Lors des épreuves de course sportive, il n'est pas rare d'afficher en parallèle le chronomètre de l'étape et celui du temps total. -Dans cette idée, écrivez un main avec deux chronomètres console qui affichent simplement leur nom et le nombre de secondes écoulées en boucle, l'un démarrant à zéro, l'autre à une valeur saisie au départ. -On doit par exemple pouvoir dérouler le scénario suivant : +On souhaite réaliser un premier analyseur de texte simple, qui observes les lignes saisies sur l'entrée standard et se met à jour à chaque nouvelle ligne saisie. +On devra par exemple pouvoir dérouler le scénario suivant : ``` Temps chrono total (en secondes) : 3247 -etape : 1 -total : 3248 -etape : 2 -total : 3249 -... +nombre de lignes : encore 3 +Hello +nombre de lignes : encore 2 +The answer is 42 +nombre de lignes : encore 1 +Sayonara +nombre de lignes atteint +Ah ? +C'est déjà fini ``` -**Optionnel** Implémentez un chronomètre en JavaFX qui affiche le nombre de secondes écoulées. -Une classe MainExample est là au besoin pour vous servir de base et commencer par vérifier la bonne configuration de JavaFX. -Notez que l'affichage JavaFX se fait dans un *thread* spécifique. -Pour que votre chronomètre JavaFX fonctionne, toute modification de l'affichage déclencée par un autre *thread* (ici le Timer) doit être fait par l'intermédiaire d'un appel à `javafx.application.Platform.runLater`, -Par exemple par une lambda telle que ceci : +Nous utiliserons le patron observateurs/observé pour l'implémenter. +* Qu'est-ce qui sera observable ? +Créer la classes correspondante en pensant bien à la faire hériter d' *Observable*. +* Quel sera l'observateur ? +Créer la classes correspondante en pensant bien à la faire implémenter *Observer*. + * En mode *push*, quelle *data* va-t-on récupérer de l'*Observable* qu'on suit lorsqu'il appellera notre méthode *update(Observable o, Object data)* ? + Faîtes en sorte qu'elle soit bien envoyée par l'objet qui sera observé. -```java -Platform.runLater( () -> { /* m-a-j affichage JavaFX */ } ); -``` -## Propriétés observables + +On va désormais ajouter un deuxième analyseur utilisant les mêmes saisies mais vérifiant un critère plus fin, qu'un caractère ait été saisi un certain nombre de fois. + + + + +Note: Des tests sont fournis dans le projet pour que vous vous assuriez que vos classes fonctionnent comme attendu. +Respectez les noms des packages, classes et méthodes + + +## Partie 3 : Propriétés observables JavaFX défini la notion de propriété observable (javafx.beans.value. ObservableValue) avec un mécanisme qui permet à un observateur d’être averti de tout changement d’état (i.e. de valeur) de la propriété (javafx.beans. property.Property). @@ -91,10 +95,13 @@ Vous devez réimplémenter ces mécanismes des propriétés. Outre le fait qu'elle soit observable (attach, detach), cette classe doit avoir une propriété à laquelle on peut accéder : ```java -package fr.univlille.iut.r304.tp4.q2; +package fr.univlille.iut.r304.tp4.q3; + public class ObservableProperty - public Object getValue() - public void setValue(Object val) + +public Object getValue() + +public void setValue(Object val) ... ``` @@ -108,12 +115,18 @@ Vérifier la validité de votre implémentation en exécutant les tests associé **Q2.2** Créez la classe ConnectableProperty qui puisse se connecter de façon mono ou bi-directionnelle : ```java -package fr.univlille.iut.r304.tp4.q2; +package fr.univlille.iut.r304.tp4.q3; public class ConnectableProperty extends ObservableProperty - public void connectTo(ConnectableProperty other){} - public void biconnectTo(ConnectableProperty other){} - public void unconnectFrom(ConnectableProperty other){} + +public void connectTo(ConnectableProperty other) { +} + +public void biconnectTo(ConnectableProperty other) { +} + +public void unconnectFrom(ConnectableProperty other) { +} ... ``` diff --git a/src/main/java/fr/univlille/iut/r304/tp4/q2/ConnectableProperty.java b/src/main/java/fr/univlille/iut/r304/tp4/q3/ConnectableProperty.java similarity index 86% rename from src/main/java/fr/univlille/iut/r304/tp4/q2/ConnectableProperty.java rename to src/main/java/fr/univlille/iut/r304/tp4/q3/ConnectableProperty.java index 57e7c887c8084f37a1df852e4341bca721850b21..bd64bc7100f1daf8ff8a99a4a6e2ab50a0710be2 100644 --- a/src/main/java/fr/univlille/iut/r304/tp4/q2/ConnectableProperty.java +++ b/src/main/java/fr/univlille/iut/r304/tp4/q3/ConnectableProperty.java @@ -1,4 +1,4 @@ -package fr.univlille.iut.r304.tp4.q2; +package fr.univlille.iut.r304.tp4.q3; public class ConnectableProperty extends ObservableProperty { diff --git a/src/main/java/fr/univlille/iut/r304/tp4/q2/ObservableProperty.java b/src/main/java/fr/univlille/iut/r304/tp4/q3/ObservableProperty.java similarity index 92% rename from src/main/java/fr/univlille/iut/r304/tp4/q2/ObservableProperty.java rename to src/main/java/fr/univlille/iut/r304/tp4/q3/ObservableProperty.java index 5a6cce8dc9b07057f556a603d71a01756f4babe5..d3ff06e7f8dcba716ec3f53eeb7fb2ba6c8d88ef 100644 --- a/src/main/java/fr/univlille/iut/r304/tp4/q2/ObservableProperty.java +++ b/src/main/java/fr/univlille/iut/r304/tp4/q3/ObservableProperty.java @@ -1,4 +1,4 @@ -package fr.univlille.iut.r304.tp4.q2; +package fr.univlille.iut.r304.tp4.q3; import fr.univlille.iut.r304.tp4.q1.Observer; diff --git a/src/test/java/fr/univlille/iut/r304/tp4/ObserverTestStub.java b/src/test/java/fr/univlille/iut/r304/tp4/q1/ObserverTestStub.java similarity index 87% rename from src/test/java/fr/univlille/iut/r304/tp4/ObserverTestStub.java rename to src/test/java/fr/univlille/iut/r304/tp4/q1/ObserverTestStub.java index f67255b8a0f9f3beec8f9976aa3a9c85f3384104..cf23de1f93b826d9c380b2baa01ead8a45ba2901 100644 --- a/src/test/java/fr/univlille/iut/r304/tp4/ObserverTestStub.java +++ b/src/test/java/fr/univlille/iut/r304/tp4/q1/ObserverTestStub.java @@ -1,7 +1,4 @@ -package fr.univlille.iut.r304.tp4; - -import fr.univlille.iut.r304.tp4.q1.Observer; -import fr.univlille.iut.r304.tp4.q1.Observable; +package fr.univlille.iut.r304.tp4.q1; /** ObserverTestStub * Can tell whether it was notified or not diff --git a/src/test/java/fr/univlille/iut/r304/tp4/q1/TestQ1.java b/src/test/java/fr/univlille/iut/r304/tp4/q1/TestQ1.java index f8bfb5001e761faff344490dde0e7d8c9a98997e..ee751d86eea8cbb44b73c1dadfe616c7368698ca 100644 --- a/src/test/java/fr/univlille/iut/r304/tp4/q1/TestQ1.java +++ b/src/test/java/fr/univlille/iut/r304/tp4/q1/TestQ1.java @@ -3,8 +3,6 @@ package fr.univlille.iut.r304.tp4.q1; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import fr.univlille.iut.r304.tp4.ObserverTestStub; - import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/fr/univlille/iut/r304/tp4/q2/TestQ1.java b/src/test/java/fr/univlille/iut/r304/tp4/q3/TestQ1.java similarity index 92% rename from src/test/java/fr/univlille/iut/r304/tp4/q2/TestQ1.java rename to src/test/java/fr/univlille/iut/r304/tp4/q3/TestQ1.java index a14f74629f2afa49db8ec443665ecd4077050565..81957cc27322075bb9a6cf2c11034bd865eefcf5 100644 --- a/src/test/java/fr/univlille/iut/r304/tp4/q2/TestQ1.java +++ b/src/test/java/fr/univlille/iut/r304/tp4/q3/TestQ1.java @@ -1,4 +1,4 @@ -package fr.univlille.iut.r304.tp4.q2; +package fr.univlille.iut.r304.tp4.q3; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import fr.univlille.iut.r304.tp4.ObserverTestStub; +import fr.univlille.iut.r304.tp4.q1.ObserverTestStub; public class TestQ1 { protected ObservableProperty prop; diff --git a/src/test/java/fr/univlille/iut/r304/tp4/q2/TestQ2.java b/src/test/java/fr/univlille/iut/r304/tp4/q3/TestQ2.java similarity index 98% rename from src/test/java/fr/univlille/iut/r304/tp4/q2/TestQ2.java rename to src/test/java/fr/univlille/iut/r304/tp4/q3/TestQ2.java index 14c5fa395677172fdba61d8ff5cc2d881ea938dd..203660aff0d2728b880c9975e88cc1fcba74ee1a 100644 --- a/src/test/java/fr/univlille/iut/r304/tp4/q2/TestQ2.java +++ b/src/test/java/fr/univlille/iut/r304/tp4/q3/TestQ2.java @@ -1,4 +1,4 @@ -package fr.univlille.iut.r304.tp4.q2; +package fr.univlille.iut.r304.tp4.q3; import static org.junit.jupiter.api.Assertions.assertEquals;