Un patron de conception Memento Un patron de conception par Rémi L. Lavoie
But « Sans violation de l’encapsulation, saisir et transmettre à l’extérieur d’un objet l’état interne de celui-ci, dans le but de pouvoir ultérieurement le restaurer dans cet état. »
Définition Le patron Memento enregistre et extériorise l’état interne d’un objet pour pouvoir restaurer l’objet à un état précédant plus tard. L’état de l’objet est sauvegardé à des points stratégiques pour que le mécanisme « undo » permette aux utilisateurs de restaurer un objet à l’état ou il était avant une certaine opération.
Diagramme de classe
Rôles des Classes Originator Créer un Memento contenant un portrait de l’état interne actuel. Utilise le Memento pour restaurer son état interne
Rôles des Classes Caretaker Est responsable du « safe-keeping » du memento N’opère jamais ou n’examine jamais le contenu du memento
Rôles des Classes Memento Sauvegarde l’état interne de l’objet Originator. Peut sauvegarder autant de composantes nécessaires (beaucoup ou peu) de l’état de Originator (laissez à la discrétion de l’originator) Protège contre l’accès par des objets autres que l’originator. Les mementos ont 2 interfaces. (façons d’interagir) Caretaker a interface minime vers Memento, il peut seulement passer le memento à d’autres objets. L’Originator, par contre, a une large interface, qui lui laisse l’accès à tous les informations nécessaires pour restaurer l’état précédent. Idéalement, seulement l’originator qui produit le memento serait permis d’accéder l’état interne du memento.
Points pour/contre + préserve les frontières d’encapsulation. + élimine le besoin de plusieurs instance du même objet (Originator) simplement pour sauvegarder son état. Une version plus restreinte est sauvegarder au lieu du Originator complet. + Simplifie l’originator, car la responsabilité de gérer le Memento est distribué au Caretaker. + simple à implémenter. - l’utilisation peut être coûteuse. (si plusieurs détails à sauvegarder)
Conseils Pratiques Si seulement 1 Memento est nécessaire, vous pouvez combine le Originator et le Caretaker. Si vous avez besoin de plusieurs Mementos, sauvegarder que les changements incrémentaux. Ceci sauvera de l’espace. Memento est souvent utilisé en conjonction avec Command, Iterator et Singleton.
Pourquoi? Laisser de l’information d’un objet accessible à d’autres objets par des méthodes d’accès Sauvegarder de l’information pour utilisation antérieur Supporter la fonction undo/redo Utilisé dans les transactions de base de données
Fonctionnement
Exemple Voici un exemple simple qui permet de sauvegarder l’état actuel et de le restaurer.
Caretaker public class Caretaker { // Memento private Memento memento; // Get public Memento getMemento() { return memento; } // Set public void setMemento(Memento m) memento = m;
Memento public class Memento { // State private String state; // Constructeur public Memento( String state ) { this.state = state; } // Get public String getState() return state;
Originator public class Originator { // State private String state = "OFF"; // Get public String getState() { return state; } //Set public void setState(String state) System.out.println("State changed to: " + state); this.state = state;
Originator (suite) // Cree le Memento public Memento CreateMemento() { return (new Memento( state )); } // Set le Memento public void SetMemento( Memento memento ) state = memento.getState(); System.out.println( "Restored to state: " + state );
Démonstration par Rémi Lavoie
Exemples d’utilisations réelles Memento peut être utilisé dans une Session de Servlet quand une session « time-out ». L’état de l’application est sauvegardé à l’aide d’un Memento et reconstruit quand l’utilisateur accède au site plus tard. Pour sauvegardé les dimension d’une fenêtre dans des applications qui permette une vue pleine-écran ou dans une fenêtre. Pour implémenter la fonction de Undo dans plusieurs applications. Utilisé dans des transactions de base de données
Références http://dept-info.labri.fr/~baudon/Master/ArchiLog/Cours.ppt.pdf http://www.dofactory.com/Patterns/PatternMemento.aspx http://www.cs.unb.ca/profs/wdu/cs4015w02/ch5f.htm