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