NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command...
Transcript of NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command...
![Page 1: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/1.jpg)
NFP1211
NFP121, Cnam/ParisCours 6-2
Les patrons Memento, Command, Template Method…
Notes de cours
jean-michel Douin, douin au cnam point frversion : 21 Novembre 2018
![Page 2: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/2.jpg)
NFP1212
Les Patrons
• Classification habituelle
– Créateurs
• Abstract Factory, Builder, Factory Method Prototype Singleton
– Structurels
• Adapter Bridge Composite Decorator Facade Flyweight Proxy
– Comportementaux
Chain of Responsability. Command Interpreter Iterator
Mediator Memento Observer State
Strategy Template Method Visitor
![Page 3: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/3.jpg)
NFP1213
Les patrons déjà vus …
• Adapter– Adapter l’interface d’une classe conforme aux souhaits du client.
• Proxy– Fournir un mandataire au client afin de contrôler/vérifier ses accès.
• Observer– Notifier un changement d’état d’une instance aux observateurs inscrits.
• Template Method– Laisser aux sous-classes une bonne part des responsabilités.
• Iterator– Parcourir une structure sans se soucier de la structure interne.
• Singleton– Garantir une et une seule instance.
• Composite, Interpreter, Visitor, …
![Page 4: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/4.jpg)
NFP1214
Bibliographie utilisée
• Design Patterns, catalogue de modèles de conception réutilisables
de Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides [Gof95]International thomson publishing France
http://www.fluffycat.com/Java-Design-Patterns/
http://www.cs.wustl.edu/~levine/courses/cs342/patterns/compounding-command_4.pdf
http://www.javapractices.com/Topic189.cjp
Pour l’annexe :
http://www.oreilly.com/catalog/hfdesignpat/
![Page 5: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/5.jpg)
NFP1215
Pré-requis
• Notions de
– Les indispensables constructions• Interface, Abstract superclass, delegation…
• Les patrons Composite, Visiteur
• Notion de Transaction
– Commit-rollback
![Page 6: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/6.jpg)
NFP1216
Sommaire
• Les patrons – Memento
• Sauvegarde et restitution de l’état d’un objet
– Command
• Ajout et suppression de « Commandes »
– Transaction ?
• Memento : persistence et mise en œuvre de la sauvegarde
• Template Method : begin, end, rollback
• Composite : structure arborescente de requêtes …
• Visiteur : parcours du composite
![Page 7: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/7.jpg)
NFP1217
Memento
Sauvegarde et restitution de l’état interne d’un objet
sans violer le principe d’encapsulation.
– Pas d’accès aux attributs en général
• Structures internes supposées inconnues
• Afin de stocker cet état, et le restituer
– Sauvegarde, annulation, journal, …
![Page 8: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/8.jpg)
NFP1218
Memento
• Sauvegarde et restitution de l’état interne d’un objet sans violer le principe d’encapsulation.
– Caretaker le conservateur
– Memento l’état de l’objet
– Originator contient les services de sauvegarde et de restitution d’un memento• Un exemple (vite…)
![Page 9: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/9.jpg)
NFP1219
Memento exemple : NotePad/Agenda
• NotePad // Originator
• NotePad.Memento // Memento
• CareTaker // Gestion d’une instance de Memento
Un agenda que l’on souhaite sauvegarder …
![Page 10: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/10.jpg)
NFP12110
NotePad / ou Agenda
• Une classe (très simple) – permettant d’ajouter et de retirer des notes/rdv
public class NotePad implements …{
private List<String> notes;
public void addNote(String note) throws NotePadFullException{
public void remove(String note){…}
Note chaque agenda a un nombre limité de notes/rdv i.e. NotePadFullException (NFE)
Patron Memento :
• NotePad.Memento est une classe interne– pour la sauvegarde et la restitution du notepad/agenda
• Note : L’état interne par définition est rarement accessible à l’extérieur … « private … » …
![Page 11: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/11.jpg)
NFP12111
Usage : Un Client un memento, 1)
public class Client {
public static void main(String[] args) throws NotePadFullException {
NotePad notes = new NotePad();
notes.addNote("15h : il pleut");
System.out.println("notes : " + notes);
Caretaker gardien = new Caretaker();
gardien.setMemento(notes.createMemento()); // sauvegarde
………
………
}
}
![Page 12: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/12.jpg)
NFP12112
Usage : Un Client un memento, 2)
public class Client {
public static void main(String[] args) throws NotePadFullException{
NotePad notes = new NotePad();
notes.addNote("15h : il pleut");
System.out.println("notes : " + notes);
Caretaker gardien = new Caretaker();
gardien.setMemento(notes.createMemento()); // sauvegarde
notes.addNote("16h : il fait beau");
System.out.println("notes : " + notes);
…………
…………
}
}
![Page 13: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/13.jpg)
NFP12113
Usage : Un Client un memento 3)
public class Client {
public static void main(String[] args) throws NotePadFullException{
NotePad notes = new NotePad();
notes.addNote("15h : il pleut");
System.out.println("notes : " + notes);
Caretaker gardien = new Caretaker();
gardien.setMemento(notes.createMemento()); // sauvegarde
notes.addNote("16h : il fait beau");
System.out.println("notes : " + notes);
notes.setMemento(gardien.getMemento()); // restitution
System.out.println("notes : " + notes);
}
}
![Page 14: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/14.jpg)
NFP12114
Memento exemple : NotePad/Agenda
• NotePad // L’agenda, une liste par délégation– Méthodes classiques d’un agenda : ajouter,….,
– Et les méthodes de sauvegarde/restitution d’un Memento createMemento, setMemento
• NotePad.Memento // Une classe interne, membre (la facilité ?)
– Méthodes de lecture/écriture d’un état de l’agenda, getState, setState
• CareTaker // Source fourni
![Page 15: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/15.jpg)
NFP12115
La facilité
sans violer le principe d’encapsulation.
– Pas d’accès aux attributs en général
• Structures internes supposées inconnues
• sur cet exemple une classe interne et membre
Valable uniquement pour cette présentation ?
Discussion
![Page 16: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/16.jpg)
NFP12116
NotePad : l’agenda
public class NotePad {
private List<String> notes = new ArrayList<String>();
public void addNote(String note) throws NFE { notes.add(note);}
public String toString(){return notes.toString(); }
private List<String> getNotes(){return this.notes;}
private void setNotes(List<String> notes){this.notes = notes;}
public Memento createMemento() {
Memento memento = new Memento();
memento.setState(); // sauvegarde du NotePad, clone, copie…
// ici la « List<String> » notes
return memento;
}
public void setMemento(Memento memento) {
memento.getState(); // restitution du NotePad
}
*NFE = NotePadFullException
![Page 17: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/17.jpg)
NFP12117
NotePad.Memento
……
// classe interne et membre… la facilité ?
public class Memento{
private List<String> mementoNotes;
public void setState(){// copie,clonage d’un notePad
mementoNotes = new ArrayList<String>(getNotes());
}
public void getState(){
setNotes(mementoNotes);
}
}
……
}// fin de la classe NotePad
![Page 18: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/18.jpg)
NFP12118
Caretaker : le conservateur de mémento
public class Caretaker {
private NotePad.Memento memento;
public NotePad.Memento getMemento() {
return memento;
}
public void setMemento(NotePad.Memento memento){
this.memento = memento;
}
}
Abstraction réussie …n’est-ce pas ? Mais …
![Page 19: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/19.jpg)
NFP12119
Caretaker : le conservateur de mementos
Plusieurs mementos ?,
une pile interne semble appropriée
public class Caretaker {
private Stack<NotePad.Memento> mementoStk;
public NotePad.Memento getMemento() {
return mementoStk.pop();
}
public void setMemento(NotePad.Memento memento){
mementoStk.push(memento);
}
}
![Page 20: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/20.jpg)
NFP12120
Usage : Un Client un gardien
public class Client {
public static void main(String[] args) throws NotePadFullException{
NotePad notes = new NotePad();
notes.addNote("15h : il pleut");
System.out.println("notes : " + notes);
Caretaker gardien = new Caretaker();
gardien.setMemento(notes.createMemento()); // sauvegarde
notes.addNote("16h : il fait beau");
System.out.println("notes : " + notes);
gardien.setMemento(notes.createMemento()); // sauvegarde
notes.addNote("17h : il neige");
System.out.println("notes : " + notes);
notes.setMemento(gardien.getMemento()); // restitution
System.out.println("notes : " + notes);
notes.setMemento(gardien.getMemento()); // restitution
System.out.println("notes : " + notes);
}
}
Démonstration ?
![Page 21: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/21.jpg)
NFP12121
La facilité
sans violer le principe d’encapsulation.
– Pas d’accès aux attributs en général
• Structures internes supposées inconnues
• sur cet exemple une classe interne et membre
Valable uniquement pour cette présentation ?
Discussion
![Page 22: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/22.jpg)
NFP12122
Conclusion intermédiaire / Discussion
• Memento
– Objectifs atteints
– Mais
• Une classe dite « externe » sur cet exemple serait difficile à réaliser
– Méthodes manquantes
– Prévoir les méthodes dès la conception de l’ « Originator »
– clone, copie en profondeur, Itérateur, Visiteur, ???, …
![Page 23: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/23.jpg)
NFP12123
Démonstration / discussion
• Discutons … Démonstration … NFE est à l’affût
![Page 24: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/24.jpg)
NFP12124
Le Patron Command
• Couplage faible opérations abstraites/réalisations concrètes
– Sur un agenda nous avons « toujours » les opérations d’ajout, de retrait de rendez-vous … que l’on pourrait qualifier d’opérations abstraites
– Les noms des opérations concrètes sont dépendants d’une implémentation
– L’implémentation, les noms de classes peuvent changer,
– Etc. …
– Comment assurer un couplage faible ? Opérations abstraites/concrètes
![Page 25: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/25.jpg)
NFP12125
Commandes : une illustration
Télécommande Universelle Harmony 1000
Ecran tactile ….Gestion des dispositifs placés dans les placards, à travers les murs et les sols Grâce à la double transmission infrarouge (IR) et radiofréquence (RF), la télécommande Harmony 1000 peut contrôler des dispositifs sans pointage ni ligne de visée. Lorsque vous utilisez la télécommande conjointement avec l’extension Harmony RF Wireless
Dispositifs ou objets que l’on ne connaît pas !
![Page 26: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/26.jpg)
NFP12126
Patron Command et notre agenda
• Les opérations de cet Agenda
Ajouter, Retirer, Afficher, …
– Comment assurer un couplage faible entre l’agenda et ces(ses ?) opérateurs ?
– Comment changer d’agenda sans remettre en cause les commandes ?
–Usage du patron Command
•Ne connaît pas les actions à effectuer
•Ne connaît pas les effecteurs
•Ne connaît pas grand chose …
•Assemblage, configuration en fonction des besoins
![Page 27: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/27.jpg)
NFP12127
Command, alias Action, Transaction …
• Abstraction des commandes effectuées– Invoker ne sait pas ce qu’il commande …. Command est une interface
– A la configuration, l’invocateur recevra• Une commande concrète incluant un récepteur concret
– Souplesse attendue de ce couplage faible …
![Page 28: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/28.jpg)
NFP12128
L’ exemple suite
• L’exemple précédent : le NotePad / agenda– Receiver : NotePad : l’agenda
• Abstraction des commandes– Command et Invoker : La télécommande universelle ….
• Ajouter, retirer– ConcreteCommand ….
![Page 29: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/29.jpg)
NFP12129
Command en exemple
• NotePad // est le Receiver
![Page 30: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/30.jpg)
NFP12130
L’interface Command
public interface Command<T>{
public void execute(T t) throws Exception;
public void undo();
}
Une télécommande générique
une commande pour chaque touche (on/off)
![Page 31: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/31.jpg)
NFP12131
Une « Command » concrète
public class AddCommand implements Command<String>{
private NotePad notes; // le receveur
public AddCommand(NotePad notes){
this.notes = notes;
}
public void execute(String note) throws Exception{
notes.addNote(note);
}
public void undo(){}
// à faire, un Mémento ??
![Page 32: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/32.jpg)
NFP12132
Invoker
Abstraction de la commande effectuée,
relier la télécommande aux opérations dont on ignore tout …
public class Invoker{
private Command<String> cmd;
public Invoker(Command<String> cmd){
this.cmd = cmd;
}
public void addNotePad(String note){
cmd.execute(note);
}
public void undo(){
cmd.undo();
}
}
![Page 33: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/33.jpg)
NFP12133
Un Client
public class ClientCommand {
public static void main(String[] args) throws Exception {
NotePad notes = new NotePad();
Invoker invoke = new Invoker(new AddCommand(notes));
invoke.addNotePad(" 15h : il pleut");
System.out.println(notes);
invoke.addNotePad(" 16h : il fait beau");
System.out.println(notes);
![Page 34: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/34.jpg)
NFP12134
Démonstration
• Souplesse de l’invocateur
– Exemples
• Configuration de l’invocateur
• Utilisation de l’invocateur
• Souplesse / Variabilité ?
![Page 35: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/35.jpg)
NFP12135
Discussion
• Patron Command– Abstraction réussie
– De l’invocateur et du récepteur
– …
– Reste en suspend la Commande undo
• Un memento ! Bien sûr
![Page 36: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/36.jpg)
NFP12136
Command & Memento
public class AddCommand implements Command<String>{
private NotePad notes;
private Caretaker gardien; // le conservateur
public AddCommand(NotePad notepad){
this.notes = notepad;
gardien = new Caretaker();
}
public void execute(String note){
gardien.setMemento(notes.createMemento());
try{
notes.addNote(note);
}catch(NotePadFullException e){}
}
public void undo(){
notes.setMemento(gardien.getMemento());
}}
// rien en cas d’erreur ??
![Page 37: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/37.jpg)
NFP12137
Un Client
public class ClientCommand2 {
public static void main(String[] args) {
NotePad notes = new NotePad(); // le receveur
Command<String> add = new AddCommand(notes); // la commande
Invoker invoke = new Invoker(add); // l’invocateur
invoke.addNotePad("15h : il pleut");
System.out.println(notes);
invoke.addNotePad(" 16h : il fait beau ");
System.out.println(notes);
invoke.undo();
System.out.println(notes);
![Page 38: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/38.jpg)
NFP12138
Démonstration …
![Page 39: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/39.jpg)
NFP12139
Une démonstration qui échoue …
• Lorsque l’agenda est rempli !
• Comment est-ce possible ?
À suivre… de près
![Page 40: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/40.jpg)
NFP12140
Combinaison de pattern
• Commande + Memento
– Fructueuse
– Discussion
![Page 41: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/41.jpg)
NFP12141
Command : un peu plus
• MacroCommande– Un ensemble de commandes à exécuter
• MacroCommand<T> implements Command<T>
![Page 42: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/42.jpg)
NFP12142
La classe MacroCommand
public class MacroCommand<T> implements Command<T>{
private Command<T>[] commands;
public MacroCommand(Command<T>[] commands){
// public MacroCommand(Commande<T>... commands){ // … discussion
this.commands = commands;
}
public void execute(T t){
for(Command<T> cmd : commands)
cmd.execute(t);
}
public void undo(){ …}
}
![Page 43: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/43.jpg)
NFP12143
Démonstration d’une MacroCommande
• Duplicate …
• Syntaxe avec les tableaux– Command<String>[]
• Command<String> cmd = new MacroCommand(new Command<String>{ajouter,ajouter});
• Syntaxe avec les tableaux ouverts– Command<String>…
• Command<String> cmd = new MacroCommand(ajouter,ajouter);
![Page 44: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/44.jpg)
NFP12144
Un Client
public class ClientCommand2 {
public static void main(String[] args) {
NotePad notes = new NotePad();
Command<String> add = new AddCommand(notes);
Command<String> duplicate = new MacroCommand(add,add);
Invoker invoke = new Invoker(duplicate); //
invoke.addNotePad("15h : il pleut");
System.out.println(notes);
invoke.addNotePad(" 16h : il fait beau ");
System.out.println(notes);
invoke.undo();
System.out.println(notes);
![Page 45: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/45.jpg)
NFP12145
Le patron Command
• Critiques possibles – Une commande concrète par classe,
– Une télécommande à 20 touches : 20 classes !
– Configuration/utilisation
• Configuration de l’invocateur par un fichier texte ?
![Page 46: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/46.jpg)
NFP12146
Commande ou transaction ?
public class AbstractCommand{
public void execute(){
beginTransaction();
// du code
endTransaction();
}
}
Transactions ?
Laissons les à la responsabilité des sous-classes
-> le patron Template Method
![Page 47: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/47.jpg)
NFP12147
Template Method
• Laissons aux sous-classes de grandes initiatives …
![Page 48: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/48.jpg)
NFP12148
Template Method
public abstract class AbstractCommand{
public abstract void beginTransaction();
public abstract void endTransaction();
public void execute(){
beginTransaction();
// du code
endTransaction();
}
}
beginTransaction / endTransaction
à faire faire …
![Page 49: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/49.jpg)
NFP12149
Command + Template Method, suite
public abstract class AbstractCommand<T> implements Command<T>{
public abstract void beginTransaction();
public abstract void endTransaction();
public abstract void rollback();
public void executer() throws Exception{
try{
beginTransaction();
// du code
endTransaction();
catch(Exception e){
rollback();
throw e;
}
}
}
beginTransaction / endTransaction / rollback
Analogue à un begin/end/rollback d’une Transaction ?
![Page 50: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/50.jpg)
NFP12150
Command + Template Method
public interface Command<T>{
public abstract void execute(T t);
}
public abstract class Transaction<T> implements Command<T>{
public abstract void beginTransaction();
public abstract void endTransaction();
public abstract void rollbackTransaction();
public void execute(T t){
try{
beginTransaction();
// du code; // instructions dite atomiques
endTransaction();
}catch(Exception e){
rollbackTransaction();
}
}
![Page 51: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/51.jpg)
NFP12151
Transaction « Sûre »
public class TransactionSure<T> extends Transaction<T>{
public void beginTransaction(){
// sauvegarde de l’état
}
public void endTransaction(){
// fin normale
}
public void rollbackTransaction(){
// restitution de l’état(Memento)
}
}
(un Memento, bien sûr)
![Page 52: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/52.jpg)
NFP12152
Et le patron Memento , souvenons-nous …
public class TransactionSure<T> extends Transaction<T>{
private Contexte ctxt;
private CareTaker gardien;
public class TransactionSure(Contexte ctxt){ …}
public void beginTransaction(){
gardien.setMemento(ctxt.createMemento());
}
public void endTransaction(){
//
}
public void rollbackTransaction(){
ctxt.setMemento(gardien.getMemento());
}
}
![Page 53: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/53.jpg)
NFP12153
Avec l’exemple initial, une nouvelle commande
• TransactionAdd et TransactionSure
![Page 54: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/54.jpg)
NFP12154
Add transactionnel
public abstract class TransactionAdd implements Command<String>{
public abstract void beginTransaction();
public abstract void endTransaction();
public abstract void rollbackTransaction();
protected NotePad notes;
public TransactionAdd(NotePad notepad){ this.notes = notepad;}
public void execute(String note) throws Exception{
try{
beginTransaction();
notes.addNote(note);
endTransaction();
}catch(Exception e){
rollbackTransaction(); throw e;
}
} }
![Page 55: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/55.jpg)
NFP12155
TransactionSure
public class TransactionSûre extends TransactionAdd{
private Caretaker gardien;
public TransactionSûre(NotePad notes){
super(notes);
this.gardien = new Caretaker();
}
public void beginTransaction(){
gardien.setMemento(notes.createMemento());
}
public void endTransaction(){
//gardien.oublie();
}
public void rollbackTransaction(){
notes.setMemento(gardien.getMemento());
}
public void undo(){
notes.setMemento(gardien.getMemento());
}}
![Page 56: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/56.jpg)
NFP12156
Le client
public class ClientCommand2 {
public static void main(String[] args) throws Exception {
NotePad notes = new NotePad();
Invoker invoke = new Invoker(new TransactionSure(notes));
invoke.addNotePad("15h : il pleut");
System.out.println(notes);
invoke.addNotePad(" 16h : il fait beau ");
System.out.println(notes);
Couplage faible …
![Page 57: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/57.jpg)
NFP12157
Conclusion à Trois Patrons
• Command + Memento + Template Method
Memento
Command
Template Method
![Page 58: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/58.jpg)
NFP12158
Plusieurs NotePad ?
• Plusieurs NotePad/Agenda mais combien ?
• L’agenda d’une équipe, c.f. Google Agenda
– Synchronisés ?
– Quelle structuration ?
– Quel parcours ?
– Une solution possible :
• Utilisation du Patron Composite
– Et les transactions ?
– Et le parcours ?, Itérateur, Visiteur ?
![Page 59: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/59.jpg)
NFP12159
Le patron Composite, rappel
• Structures de données récursives– Hiérarchiques, arborescentes, …
![Page 60: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/60.jpg)
NFP12160
Plusieurs agendas : usage du Composite
public abstract class NotePadComponent{
public abstract void addNote(String note) throws NotePadFullException;
public abstract void remove(String note);
public abstract String toString();
}
Rappel tout est NotePadComponent
![Page 61: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/61.jpg)
NFP12161
Classe NotePadComposite
public class NotePadComposite extends NotePadComponent{
private List<NotePadComponent> list;
public NotePadComposite(){
list = new ArrayList<NotePadComponent>();
}
public void addNote(String note) throws NotePadFullException{
for(NotePadComponent n : list)
n.addNote(note);
}
public void remove(String note){…}
public String toString(){…}
public void addChild(NotePadComponent notePad){
list.add(notePad);
}
public List<NotePadComponent> getChildren(){
return list;
}
![Page 62: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/62.jpg)
NFP12162
Hiérarchie d’agendas ? Pierre Pol et Jak
• 3 agendas une seule instance – Un composite d’agendas
public static void testSimple() throws NotePadFullException{
NotePadComposite agendas = new NotePadComposite();
NotePad agendaDePierre = new NotePad(5); // 5 rdv possibles
NotePad agendaDePol = new NotePad(15);
NotePad agendaDeJak = new NotePad(7);
agendas.addChild(agendaDePierre);
agendas.addChild(agendaDePol);
agendas.addChild(agendaDeJak);
agendas.addNote("21:30 au KIBELE, 12 rue de l’échiquier");
System.out.println(agendas);
}
agendas
pierre pol jak
![Page 63: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/63.jpg)
NFP12163
Une autre composition, l’agent et Pierre Pol Jak
public static void testEncoreSimple() throws NotePadFullException{
NotePadComposite groupe = new NotePadComposite();
NotePad agendaDePierre = new NotePad(5);
NotePad agendaDePol = new NotePad(15);
NotePad agendaDeJak = new NotePad(7);
groupe.addChild(agendaDePierre);
groupe.addChild(agendaDePol);
groupe.addChild(agendaDeJak);
NotePadComposite agenda = new NotePadComposite();
NotePad agent = new NotePad(15);
agenda.addChild(agent);
agenda.addChild(groupe);
agenda.addNote("21h : à l’entrepôt, Paris XIVème");
System.out.println(agenda);
}
groupe
pierre pol jak
agent
agenda
![Page 64: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/64.jpg)
NFP12164
Mais …
• Équité entre les agendas (leur possesseur ?)
– Si l’un d’entre eux est rempli (une exception est levée … NFE*)
– Que fait-on ?• La réunion reste programmée …
Ou bien
• La réunion est annulée …
– Un groupe sans le chanteur ?
– Annulation, assurance
– Transaction à la rescousse
* NotePadFullException
![Page 65: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/65.jpg)
NFP12165
Transaction ?
• L’un des agendas est « rempli »
– Levée de l’exception NotePadFullException
– Opération atomique :
Alors
– Template Method + Command + Composite + Memento
• Memento d’un composite ?
• C’est tout ? …
![Page 66: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/66.jpg)
NFP12166
Template & Command
public interface Command<T>{
public void execute(T t);
public void undo();
}
public abstract class Transaction extends Command<String>{
protected NotePadComponent notePad;
public abstract void beginTransaction();
public abstract void endTransaction();
public abstract void rollbackTransaction();
public Transaction (NotePadComponent notePad){
this. notePad = notePad;
}
![Page 67: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/67.jpg)
NFP12167
Transaction suite
public void execute(String note){
try{
beginTransaction();
notePad.addNote(note);
endTransaction();
}catch(Exception e){
rollbackTransaction();
}
}
}
Du déjà vu …
![Page 68: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/68.jpg)
NFP12168
Mais pourquoi une Transaction ?
• Exemple : c’est jak qui est surbooké …
• agenda.addNote("15/10, A Bercy ")– groupe.addNote("15/10, A Bercy ")
• pierre.addNote("15/10, A Bercy ") // réussi, rdv pris• pol.addNote ("15/10, A Bercy ") // réussi, rdv pris
• jak.addNote("15/10, A Bercy ") // échec, exception NFE
• -> restitution de l’agenda initial de pierre et pol // transaction de la commande
groupe
pierre pol jak
agent
agenda
![Page 69: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/69.jpg)
NFP12169
Parfois le besoin d’un itérateur est pressant …
• Patron Composite + Itérateur – Vers un Memento de composite
public class NotePadComposite
extends NotePadComponent
implements Iterable<NotePadComponent>{
public Iterator<NodePadComponent> iterator(){
return …
}
![Page 70: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/70.jpg)
NFP12170
Discussion, petite conclusion à 4 patrons
Template Method
+
Command
+
Composite/Iterator *
+
Memento de Composite
=
?
* voir en annexe, un itérateur de composite extrait de http://www.oreilly.com/catalog/hfdesignpat/
![Page 71: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/71.jpg)
NFP12171
L’Itérateur : parfois complexe … un extrait
public Iterator<NotePadComponent> iterator(){ return new CompositeIterator(list.iterator()); }
private class CompositeIterator implements Iterator<NotePadComponent>{private Stack<Iterator<NotePadComponent>> stk;
public CompositeIterator(Iterator<NotePadComponent> iterator){stk = new Stack<Iterator<NotePadComponent>>();stk.push(iterator);
}
public boolean hasNext(){if(stk.empty()) return false;while( !stk.empty() && !stk.peek().hasNext()) stk.pop(); // Lisible ?return !stk.empty() && stk.peek().hasNext();
}
public NotePadComponent next(){if(hasNext()){…
un extrait de tête la première …http://www.oreilly.com/catalog/hfdesignpat/
![Page 72: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/72.jpg)
NFP12172
À visiter … vaut le détour
• Patron Iterator– Parcours du Composite (le code complet est en annexe)
public interface Iterator<T>{
boolean hasNext()
E next();
void remove(); // optionnel
}
• Patron Visitor– Parcours, actions définis par le client,
– Une visite par nœud concret du Composite
![Page 73: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/73.jpg)
NFP12173
Le patron Visitor
public abstract class Visitor<T>{
public abstract T visit(NotePad notePad);
public abstract T visit(NotePadComposite notePad);
}
– La Racine du Composite, contient la méthode accept
public abstract <T> T accept(Visitor<T> visitor);
– Toutes les classes, feuilles du composite ont cette méthode
public <T> T accept(Visitor<T> visitor){
return visitor.visit(this);
}
![Page 74: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/74.jpg)
NFP12174
Le Composite nouveau est arrivé
La classe Racine du Composite s’est enrichie
public abstract class NotePadComponent {
public abstract void addNote(String note) throws NotePadFullException;
public abstract void remove(String note);
public abstract List<String> getNotes();
public abstract String toString();
public abstract <T> T accept(Visitor<T> visitor);
}
Chaque classe concrète Nœud déclenche la visite appropriéepublic class NotePad extends NotePadComponent {
…
public <T> T accept(Visitor<T> visitor){
return visitor.accept(this);
}
}
![Page 75: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/75.jpg)
NFP12175
Les visiteurs
• Tout type de visite à la charge du client devient possible …
• Plus simple : c’est au « client » de le faire … une bonne idée…
![Page 76: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/76.jpg)
NFP12176
Un CloneVisitor
public class CloneVisitor extends Visitor<NotePadComponent>{
public NotePadComponent visit(NotePad notePad){
NotePad clone = new NotePad(notePad.getCapacity());
try{
for(String note : notePad.getNotes()){
clone.addNote(note);
}
return clone;
}catch(NotePadFullException e){return null;}
}
public NotePadComponent visit(NotePadComposite notePad){
NotePadComposite clone = new NotePadComposite();
for( NotePadComponent n : notePad.getChildren()){
clone.addChild(n.accept(this));
}
return clone;
}}
![Page 77: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/77.jpg)
NFP12177
Un test parmi d’autres
public void testAgentPierrePolJak_Visitors(){
try{
NotePadComposite groupe = new NotePadComposite();
NotePad agendaDePierre = new NotePad(5);
NotePad agendaDePol = new NotePad(15);
NotePad agendaDeJak = new NotePad(7);
groupe.addChild(agendaDePierre);groupe.addChild(agendaDePol);
groupe.addChild(agendaDeJak);
NotePadComposite agenda = new NotePadComposite();
NotePad agent = new NotePad(15);
agenda.addChild(agent);
agenda.addChild(groupe);
NotePadComponent clone = agenda.accept(new CloneVisitor());
System.out.println("clone.toString() : " + clone);
System.out.println("clone_visitor : " + clone.accept(new StringVisitor()));
}catch(NotePadFullException e){
fail(" agenda plein ? ");
}catch(Exception e){
fail("exception inattendue ??? " + e.getMessage());
}}
![Page 78: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/78.jpg)
NFP12178
Conclusion à 5 Patrons
Template Method
+
Command
+
Composite/Iterator
+
Memento/Visitor (CloneVisitor)
=
?
![Page 79: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/79.jpg)
NFP12179
Conclusion
• Assemblage de Patrons == une application
• Un exemple complet un peu plus conséquent– Junit : http://junit.sourceforge.net/doc/cookstour/cookstour.htm
![Page 80: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/80.jpg)
NFP12180
Annexes
• Patron Composite et parcours
– Souvent récursif, « intra-classe »
– Avec un itérateur
• Même recette …
• Une pile mémorise l’itérateur de chaque classe « composite »
– Avec un visiteur
![Page 81: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/81.jpg)
NFP12181
Composite et Iterator
• Structure récursive « habituelle »
Composant
CompositeFeuille
![Page 82: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/82.jpg)
NFP12182
En partie extrait de http://www.oreilly.com/catalog/hfdesignpat/
public class Composite
extends Composant implements Iterable<Composant>{
private List<Composite> liste;
public Composite(…){
this.liste = …
}
public void ajouter(Composant c){
liste.add(c);
}
public Iterator<Composant> iterator(){
return new CompositeIterator(liste.iterator());
}
• Classe Composite : un schéma
![Page 83: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/83.jpg)
NFP12183
CompositeIterator : comme sous-classe
private class CompositeIterator
implements Iterator<Composant>{
// une pile d’itérateurs,
// un itérateur par commposite
private Stack<Iterator<Composant>> stk;
public CompositeIterator (Iterator<Composant> iterator){
this.stk = new Stack<Iterator<Composant>>();
this.stk.push(iterator);
}
![Page 84: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/84.jpg)
NFP12184
next
public Composant next(){
if(hasNext()){
Iterator<Composant> iterator = stk.peek();
Composant cpt = iterator.next();
if(cpt instanceof Composite){
Composite gr = (Composite)cpt;
stk.push(gr.liste.iterator());
}
return cpt;
}else{
throw new NoSuchElementException();
}
}
public void remove(){
throw new UnsupportedOperationException();
}
}
![Page 85: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/85.jpg)
NFP12185
hasNext
public boolean hasNext(){
if(stk.empty()){
return false;
}else{
Iterator<Composant> iterator = stk.peek();
if( !iterator.hasNext()){
stk.pop();
return hasNext();
}else{
return true;
}
}
}
![Page 86: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/86.jpg)
NFP12186
Un test unitaire possible
public void testIterator (){
try{
Composite g = new Composite();
g.ajouter(new Composant());
g.ajouter(new Composant());
g.ajouter(new Composant());
Composite g1 = new Composite();
g1.ajouter(new Composant());
g1.ajouter(new Composant());
g.ajouter(g1);
for(Composite cpt : g){ System.out.println(cpt);}
Iterator<Composite> it = g.iterator();
assertTrue(it.next() instanceof Composant);
assertTrue(it.next() instanceof Composant);
assertTrue(it.next() instanceof Composant);
assertTrue(it.next() instanceof Groupe);
// etc.
![Page 87: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/87.jpg)
NFP12187
Composite & Iterator : l’exemple NotePad
public Iterator<NotePadComponent> iterator(){
return new CompositeIterator(list.iterator());
}
private class CompositeIterator implements Iterator<NotePadComponent>{
private Stack<Iterator<NotePadComponent>> stk;
public CompositeIterator(Iterator<NotePadComponent> iterator){
stk = new Stack<Iterator<NotePadComponent>>();
stk.push(iterator);
}
public boolean hasNext(){
if(stk.empty()) return false;
while( !stk.empty() && !stk.peek().hasNext()) stk.pop();
return !stk.empty() && stk.peek().hasNext();
}
![Page 88: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/88.jpg)
NFP12188
NotePadComposite
public NotePadComponent next(){
if(hasNext()){
Iterator<NotePadComponent> iterator = stk.peek();
NotePadComponent notepad = iterator.next();
if(notepad instanceof NotePadComposite){
NotePadComposite composite = (NotePadComposite)notepad;
stk.push(composite.list.iterator());
}
return notepad;
}else{
throw new NoSuchElementException();
}
}
public void remove(){
throw new UnsupportedOperationException();
}
}
![Page 89: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/89.jpg)
NFP12189
Avec un visiteur
public abstract class Visitor<T>{
public abstract T visit(NotePad notePad);
public abstract T visit(NotePadComposite notePad);
}
![Page 90: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/90.jpg)
NFP12190
CloneVisitor
public class CloneVisitor extends Visitor<NotePadComponent>{
public NotePadComponent visit(NotePad notePad){
NotePad clone = new NotePad(notePad.getCapacity());
try{
for(String note : notePad.getNotes()){
clone.addNote(note);
}
return clone;
}catch(NotePadFullException e){ return null;}
}
public NotePadComponent visit(NotePadComposite notePad){
NotePadComposite clone = new NotePadComposite();
for( NotePadComponent n : notePad.getChildren()){
clone.addChild(n.accept(this));
}
return clone;
}}
![Page 91: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/91.jpg)
NFP12191
Command et java.awt.*
• Button, MenuItem sont les invocateurs
• ActionListener la Commande
• Une implémentation d’ActionListener : – une commande concrète
• Le code d’ActionListener contient l’appel du récepteur
• Exemple qui suit est extrait de – http://www.cs.wustl.edu/~levine/courses/cs342/patterns/compounding-command_4.pdf
![Page 92: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/92.jpg)
NFP12192
Command ActionListener …
Extrait de http://www.cs.wustl.edu/~levine/courses/cs342/patterns/compounding-command_4.pdf
![Page 93: NFP121, Cnam/Paris Cours 6-2 Les patrons Memento, Command ...jfod.cnam.fr/nfp121/supports/NFP121_cours_06_2_Memento_Command...NFP121 3 Les patrons déjà vus … • Adapter – Adapter](https://reader031.fdocuments.us/reader031/viewer/2022022803/5c8026d209d3f293438c712e/html5/thumbnails/93.jpg)
NFP12193
Est-ce bien le patron command ?
• « Quit » est l’invocateur
• ActionListener : Command– actionPerformed comme execute,…
• System.exit(0) : Receiver