Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Design Patterns en C#
  3. Le pattern Memento
Extrait - Design Patterns en C# Les 23 modèles de conception : descriptions et solutions illustrées en UML 2 et C# [3e édition]
Extraits du livre
Design Patterns en C# Les 23 modèles de conception : descriptions et solutions illustrées en UML 2 et C# [3e édition]
1 avis
Revenir à la page d'achat du livre

Le pattern Memento

Description

Le pattern Memento a pour but de sauvegarder et de restaurer l’état d’un objet sans en violer l’encapsulation.

Exemple

Lors de l’achat en ligne d’un véhicule neuf, le client peut choisir des options supplémentaires qui vont être ajoutées à son chariot. Cependant, il existe des options incompatibles comme, par exemple, les sièges sportifs qui sont incompatibles avec les sièges en cuir ou les accoudoirs.

La conséquence de cette incompatibilité est que si les accoudoirs ont été choisis et qu’ensuite les sièges sportifs sont choisis, l’option des accoudoirs est retirée du chariot.

Nous désirons ensuite ajouter une option d’annulation de la dernière opération effectuée dans le chariot. Retirer la dernière option ajoutée n’est pas suffisant car il faut aussi remettre les options présentes et qui ont été retirées pour cause d’incompatibilité. Une solution consiste à mémoriser l’état du chariot avant l’ajout d’une nouvelle option.

Par la suite, nous souhaitons étendre ce mécanisme pour gérer un historique des états du chariot et pouvoir revenir à n’importe quel état. Il faut alors, dans ce cas, mémoriser tous les états successifs du chariot.

Pour préserver l’encapsulation de l’objet représentant le chariot, une solution consisterait à mémoriser...

Structure

1. Diagramme de classes

La figure 4-7.2 détaille la structure générique du pattern.

images/figure23-2.png

Figure 4-7.2 - Structure du pattern Memento

2. Participants

Les participants au pattern sont les suivants :

  • Mémento est la classe des mémentos qui sont les objets qui mémorisent l’état interne des objets d’origine (ou une partie de cet état). Le mémento possède deux interfaces : une interface complète destinée aux objets d’origine qui offre la possibilité de mémoriser et restaurer leur état et une interface réduite pour les objets de gestion de l’état qui n’ont pas le droit d’accéder à l’état interne des objets d’origine.

  • ObjetOrigine (ChariotOption) est la classe des objets qui créent un mémento pour mémoriser leur état interne qu’ils peuvent également restaurer à partir d’un mémento.

  • GestionÉtat est responsable de la gestion des mémentos et n’accède pas à l’état interne des objets d’origine.

3. Collaborations

Une instance de GestionÉtat demande un mémento à l’objet d’origine par appel de la méthode créeMémento, le sauvegarde et en cas de besoin d’annulation et de retour à l’état mémorisé...

Domaines d’application

Le pattern est utilisé dans le cas où l’état interne d’un objet (totalement ou en partie) doit être mémorisé afin de pouvoir être restauré ultérieurement sans que l’encapsulation de cet objet ne doive être brisée.

Exemple en C#

Nous commençons la présentation de l’exemple C# par le mémento. Celui-ci est décrit par l’interface Memento et la classe MementoImpl. La classe introduit la propriété etat dont l’invocation des accesseurs est réservée au seul chariot. L’interface est vide, elle ne sert qu’à déterminer un type pour les autres objets qui doivent référencer le mémento sans pouvoir accéder à la propriété etat.

Le mémento stocke l’état du chariot d’options à savoir une liste qui est construite par duplicata de la liste des options du chariot.

public interface Memento 
{ 
} 
 
 
using System.Collections.Generic; 
 
public class MementoImpl : Memento 
{ 
 protected IList<OptionVehicule> options =  
     new List<OptionVehicule>(); 
 
 public IList<OptionVehicule> etat 
 { 
   get 
   { 
    return options; 
   } 
   set 
   { 
    this.options.Clear(); 
    foreach (OptionVehicule option in value) 
      this.options.Add(option); 
   } 
 } 
} 

La classe ChariotOption décrit...