1. Qu'est-ce que le modèle Memento

Le modèle Memento est un motif de conception comportemental utilisé pour sauvegarder et restaurer l'état interne d'un objet. Il enregistre l'état de l'objet dans un objet memento, qui peut être utilisé pour restaurer l'objet à un état antérieur dans le futur.

2. Caractéristiques et avantages du modèle Memento

Les caractéristiques et avantages du modèle Memento incluent:

  • Il peut sauvegarder et restaurer l'état interne d'un objet sans violer le principe d'encapsulation.
  • Il peut gérer de manière flexible les états historiques d'un objet, facilitant ainsi les opérations d'annulation et de rétablissement.
  • Il permet de sauvegarder l'état de manière externe, évitant ainsi l'exposition de l'état interne de l'objet.

3. Exemples d'applications pratiques du modèle Memento

Le modèle Memento a de nombreux scénarios d'application pratique, dont certains exemples incluent:

  • La fonctionnalité d'annulation et de rétablissement dans les éditeurs de texte, qui peuvent utiliser le modèle Memento pour sauvegarder l'état de chaque opération.
  • La fonctionnalité de sauvegarde et de chargement dans les jeux, qui peuvent utiliser le modèle Memento pour sauvegarder la progression du jeu.
  • La fonction de stockage de brouillon dans les clients de messagerie électronique, qui peuvent utiliser le modèle Memento pour sauvegarder l'état des brouillons de courriels.

4. Implémentation du modèle Memento en Golang

4.1. Diagramme de classe UML

Modèle Memento en Golang

4.2. Introduction de l'exemple

Description basée sur le diagramme de classe UML

Dans cet exemple, nous avons une classe Originator avec un état interne appelé "state". L'Originator définit l'état à l'aide de la méthode SetState et crée un objet memento à l'aide de la méthode CreateMemento. L'état interne de l'objet memento est identique à celui de l'Originator. La classe Caretaker est responsable de stocker l'objet memento et d'ajouter des mementos à l'aide de la méthode AddMemento.

Étapes d'implémentation

  1. Créer l'objet Memento, qui a une méthode GetState pour sauvegarder l'état interne de l'Originator.
  2. Créer l'objet Originator, qui a des méthodes pour définir l'état et créer un memento.
  3. Créer l'objet Caretaker, qui est responsable de sauvegarder l'objet memento.
  4. Implémenter les méthodes pour créer un memento et restaurer l'état dans l'Originator:
    • Lors de la création d'un objet memento, sauvegardez l'état de l'Originator dans le memento.
    • Lors de la restauration de l'état, restaurez l'état du memento à l'Originator.
  5. Implémenter les méthodes pour ajouter un memento et obtenir un memento dans le Caretaker:
    • La méthode d'ajout de memento est utilisée pour sauvegarder l'objet memento dans le Caretaker.
    • La méthode d'obtention de memento est utilisée pour récupérer l'objet memento du Caretaker.

4.3.1. Créer un objet Memento

type Memento struct {
	state string
}

func (m *Memento) GetState() string {
	return m.state
}

4.3.2. Stocker l'état dans le Memento

type Originator struct {
	state string
}

func (o *Originator) SetState(state string) {
	o.state = state
}

func (o *Originator) CreateMemento() *Memento {
	return &Memento{state: o.state}
}

4.3.3. Restaurer l'état à partir du Memento

func (o *Originator) SetMemento(memento *Memento) {
	o.state = memento.GetState()
}

4.3.4. Utilisation du modèle Memento pour les opérations d'annulation

type Caretaker struct {
	mementos []*Memento
}

func (c *Caretaker) AddMemento(m *Memento) {
	c.mementos = append(c.mementos, m)
}

func (c *Caretaker) GetMemento(index int) *Memento {
	return c.mementos[index]
}

4.3.5. Utiliser le motif Memento pour les opérations de refaire

func main() {
	originator := &Originator{}
	caretaker := &Caretaker{}

	originator.SetState("État 1")
	caretaker.AddMemento(originator.CreateMemento())

	originator.SetState("État 2")
	caretaker.AddMemento(originator.CreateMemento())

	originator.SetMemento(caretaker.GetMemento(0))
	fmt.Println("État de l'originator après restauration à l'état 1:", originator.state)

	originator.SetMemento(caretaker.GetMemento(1))
	fmt.Println("État de l'originator après restauration à l'état 2:", originator.state)
}