Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Design Patterns en Java
  3. Le pattern Memento
Extrait - Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception
Extraits du livre
Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception 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 Java

Nous commençons la présentation de l’exemple Java par le mémento. Celui-ci est décrit par l’interface Memento et la classe MementoImpl. La classe introduit les méthodes getEtat et setEtat dont l’invocation 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 aux méthodes getEtat et setEtat.

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 
{ 
} 
 
import java.util.ArrayList; 
import java.util.List; 
public class MementoImpl implements Memento 
{ 
  protected List<OptionVehicule> options =  
    new ArrayList<OptionVehicule>(); 
 
  public void setEtat(List<OptionVehicule> options) 
  { 
    this.options.clear(); 
    this.options.addAll(options); 
  } 
 
  public List<OptionVehicule> getEtat() 
  { 
    return options; 
  } 
} 

La classe ChariotOption décrit...