Ce projet vise à développer un mini-éditeur de texte en appliquant des concepts de conception orientée objet et des design patterns standard pour améliorer la structure et la maintenabilité du code. Le projet est divisé en deux versions :
- V1 : Implémentation des fonctionnalités de base d’édition (sélection, copier, couper, coller) en utilisant le pattern Command.
- V2 : Ajout de fonctionnalités avancées comme l'annulation, la répétition et l'enregistrement des actions, en utilisant le pattern Memento.
- Sélection de texte : Permet à l'utilisateur de sélectionner une portion de texte.
- Copier : Copie la sélection dans le presse-papier.
- Couper : Copie la sélection dans le presse-papier puis l’efface du texte.
- Coller : Remplace la sélection actuelle par le contenu du presse-papier.
- Défaire/Refaire : Annule ou restaure les dernières actions, avec un historique basé sur le pattern Memento.
- Enregistrement et Rejouer les actions : Enregistre une séquence d’actions qui peut être rejouée ultérieurement.
Pour la version 1, nous avons choisi d'implémenter le pattern Command comme décrit dans cette page. Ce pattern permet d'encapsuler chaque action (comme Copier, Couper et Coller) en tant qu'objet de commande, ce qui simplifie l’extension et la modification des actions disponibles.
Les diagrammes ci-dessous illustrent la conception de la version 1 :
-
Diagramme de Cas d'Utilisation
-
Diagramme de Classe :
Diagramme de Classe - Version 1
- EditeurBuffer contient un PressePapier pour stocker le texte.
- InterfaceUtilisateur utilise une liste de Bouton pour permettre à l’utilisateur de déclencher des actions spécifiques dans l’éditeur.
- Bouton possède un objet Command pour exécuter une action lorsqu'il est activé.
- Chaque commande interagit directement avec le texte de l'éditeur.
- Selection hérite de Command pour représenter des actions spécifiques de manipulation de la sélection.
- Les classes Copier, Couper et Coller héritent de Command, ce qui leur permet d’exécuter des actions distinctes tout en suivant une interface commune définie par Command.
- Les classes DeplacerSelectionGauche et DeplacerSelectionDroite héritent de Selection pour modifier la position de la sélection dans le texte, en la déplaçant respectivement vers la gauche ou la droite.
-
Diagrammes de Séquence :
- Séquence Couper : Diagramme de séquence pour la fonctionnalité - Couper
- Séquence Copier : Diagramme de séquence pour la fonctionnalité - Copier
- Séquence Coller : Diagramme de séquence pour la fonctionnalité - Coller
Pour la version 2, nous avons introduit le pattern Memento pour gérer l'historique des actions, comme expliqué dans cette page. Ce pattern permet de sauvegarder et de restaurer l'état de l'éditeur, facilitant la fonctionnalité d'annulation et de répétition des actions.
Les diagrammes ci-dessous illustrent la conception de la version 2 :
-
Diagramme de Cas d'Utilisation
-
Diagramme de Classe :
Diagramme de Classe - Version 2
Nous avons ajouté à la version V1 les classes suivantes :
-
Classe Memento : Stocke une instance de l'état de l'éditeur ce qui permet de restaurer un état précédent de l'éditeur.
-
Classe Historique : Utilise deux piles pour gérer les actions "annuler" et "rétablir" en enregistrant un état après chaque modification, ce qui permet de naviguer entre les états précédents et futurs de l’éditeur.
-
Classe EnregistrerAction : Sous-classe de Command qui permet d'enregistrer une séquence d'actions dans une liste pour les rejouer ultérieurement.
-
Classe RejouerAction : Sous-classe de Command pour exécuter automatiquement une séquence d'actions enregistrée dans EnregistrerAction.
-
Classes DefaireAction et RefaireAction : Gèrent l'annulation et la répétition des actions en utilisant la classe Historique.
-
-
Diagrammes de Séquence :
-
Défaire les actions : Diagramme de séquence pour la fonctionnalité - Défaire les actions
-
Refaire les actions : Diagramme de séquence pour la fonctionnalité - Refaire les actions
-
Enregistrer les actions : Diagramme de séquence pour la fonctionnalité - Enregistrer les actions
-
Rejouer les actions : Diagramme de séquence pour la fonctionnalité - Rejouer les actions
-
- Clonez le dépôt :
git clone <lien_du_projet>
- Ouvrez le projet dans un IDE (Eclipse ou VSCode).
- Exécutez la classe
Main
pour lancer chaque version. - Utilisez l’interface pour tester les commandes de copie, couper, coller, ainsi que les fonctionnalités d’annulation et d’enregistrement (voir demo).
- Java : Langage de programmation.
- PlantUML : Outil pour la création des diagrammes UML.
- draw.io : Outil pour la création des diagrammes UML.
- Eclips : Environnements de développement intégrés pour l'implémentation du code en Java.
- VSCode : Editeur de code pour utiliser PlantUML.
tp2_omd_designpattern/
│
├── Conception/
│ ├── V1/
│ └── V2/
│
├── Code_MiniEditeur/
│ ├── V1/
│ │ └── src/
│ │ ├── client/
│ │ │ └── InterfaceUtilisateur.java
│ │ ├── command/
│ │ │ ├── Command.java
│ │ │ ├── Coller.java
│ │ │ ├── Copier.java
│ │ │ ├── Couper.java
│ │ │ ├── Selection.java
│ │ │ ├── DeplacerSelectionDroite.java
│ │ │ └── DeplacerSelectionGauche.java
│ │ ├── invoker/
│ │ │ └── Bouton.java
│ │ ├── receiver/
│ │ │ └── EditeurBuffer.java
│ │ └── main/
│ │ ├── Main.java
│ │ └── PressePapier.java
│ │
│ └──V2/
│ └── src/
│ ├── caretaker/
│ │ └── Historique.java
│ ├── memento/
│ │ └── Memento.java
│ ├── originator/
│ │ └── EditeurBuffer.java
│ ├── client/
│ │ └── InterfaceUtilisateur.java
│ ├── command/
│ │ ├── Command.java
│ │ ├── Coller.java
│ │ ├── Copier.java
│ │ ├── Couper.java
│ │ ├── Selection.java
│ │ ├── DeplacerSelectionDroite.java
│ │ ├── DeplacerSelectionGauche.java
│ │ ├── RejouerAction.java
│ │ ├── RefaireAction.java
│ │ └── EnregistrerAction.java
│ ├── invoker/
│ │ └── Bouton.java
│ └── main/
│ ├── Main.java
│ └── PressePapier.java
│
├── demo_V1.mp4
├── demo_V2.mp4
└── README.md