Memento Un patron de conception par Rmi L

  • Slides: 19
Download presentation
Memento Un patron de conception par Rémi L. Lavoie

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

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. » 2

Définition § Le patron Memento enregistre et extériorise l’état interne d’un objet pour pouvoir

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. 3

Diagramme de classe 4

Diagramme de classe 4

Rôles des Classes § Originator § Créer un Memento contenant un portrait de l’état

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 5

Rôles des Classes § Caretaker § Est responsable du « safe-keeping » du memento

Rôles des Classes § Caretaker § Est responsable du « safe-keeping » du memento § N’opère jamais ou n’examine jamais le contenu du memento 6

Rôles des Classes § Memento § Sauvegarde l’état interne de l’objet Originator. Peut sauvegarder

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 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. 7

Points pour/contre § + préserve les frontières d’encapsulation. § + élimine le besoin de

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) 8

Conseils Pratiques § Si seulement 1 Memento est nécessaire, vous pouvez combine le Originator

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. 9

Pourquoi? § Laisser de l’information d’un objet accessible à d’autres objets par des méthodes

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 10

Fonctionnement 11

Fonctionnement 11

Exemple § Voici un exemple simple qui permet de sauvegarder l’état actuel et de

Exemple § Voici un exemple simple qui permet de sauvegarder l’état actuel et de le restaurer. 12

Caretaker public class Caretaker { // Memento private Memento memento; // Get public Memento

Caretaker public class Caretaker { // Memento private Memento memento; // Get public Memento get. Memento() { return memento; } // Set public void set. Memento(Memento m) { memento = m; } } 13

Memento public class Memento { // State private String state; // Constructeur public Memento(

Memento public class Memento { // State private String state; // Constructeur public Memento( String state ) { this. state = state; } // Get public String get. State() { return state; } } 14

Originator public class Originator { // State private String state = "OFF"; // Get

Originator public class Originator { // State private String state = "OFF"; // Get public String get. State() { return state; } //Set public void set. State(String state) { System. out. println("State changed to: " + state); this. state = state; } 15

Originator (suite) // Cree le Memento public Memento Create. Memento() { return (new Memento(

Originator (suite) // Cree le Memento public Memento Create. Memento() { return (new Memento( state )); } // Set le Memento public void Set. Memento( Memento memento ) { state = memento. get. State(); System. out. println( "Restored to state: " + state ); } } 16

Démonstration par Rémi Lavoie 17

Démonstration par Rémi Lavoie 17

Exemples d’utilisations réelles § Memento peut être utilisé dans une Session de § §

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 18

Références § http: //dept-info. labri. fr/~baudon/Master/Archi. Log/Cours. ppt. pdf § http: //www. dofactory. com/Patterns/Pattern.

Références § http: //dept-info. labri. fr/~baudon/Master/Archi. Log/Cours. ppt. pdf § http: //www. dofactory. com/Patterns/Pattern. Memento. aspx § http: //www. cs. unb. ca/profs/wdu/cs 4015 w 02/ch 5 f. htm 19