SOLDES de printemps
Mémento

Mémento en Go

Le Mémento est un patron de conception comportemental qui permet de prendre des instantanés de l’état d’un objet et de les restaurer plus tard.

Le mémento ne compromet pas l’intégrité de la structure interne de l’objet avec lequel il interagit, ni celle des données contenues dans l’instantané.

Exemple conceptuel

Le patron de conception mémento permet de sauvegarder les instantanés de l’état d’un objet. Vous pouvez les utiliser pour rétablir un objet dans un état passé. Ce système se montre très pratique pour implémenter des opérations annuler-rétablir sur un objet.

originator.go: Créateur

package main

type Originator struct {
	state string
}

func (e *Originator) createMemento() *Memento {
	return &Memento{state: e.state}
}

func (e *Originator) restoreMemento(m *Memento) {
	e.state = m.getSavedState()
}

func (e *Originator) setState(state string) {
	e.state = state
}

func (e *Originator) getState() string {
	return e.state
}

memento.go: Mémento

package main

type Memento struct {
	state string
}

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

caretaker.go: Gardien

package main

type Caretaker struct {
	mementoArray []*Memento
}

func (c *Caretaker) addMemento(m *Memento) {
	c.mementoArray = append(c.mementoArray, m)
}

func (c *Caretaker) getMemento(index int) *Memento {
	return c.mementoArray[index]
}

main.go: Code client

package main

import "fmt"

func main() {

	caretaker := &Caretaker{
		mementoArray: make([]*Memento, 0),
	}

	originator := &Originator{
		state: "A",
	}

	fmt.Printf("Originator Current State: %s\n", originator.getState())
	caretaker.addMemento(originator.createMemento())

	originator.setState("B")
	fmt.Printf("Originator Current State: %s\n", originator.getState())
	caretaker.addMemento(originator.createMemento())

	originator.setState("C")
	fmt.Printf("Originator Current State: %s\n", originator.getState())
	caretaker.addMemento(originator.createMemento())

	originator.restoreMemento(caretaker.getMemento(1))
	fmt.Printf("Restored to State: %s\n", originator.getState())

	originator.restoreMemento(caretaker.getMemento(0))
	fmt.Printf("Restored to State: %s\n", originator.getState())

}

output.txt: Résultat de l’exécution

originator Current State: A
originator Current State: B
originator Current State: C
Restored to State: B
Restored to State: A

Mémento dans les autres langues

Mémento en C# Mémento en C++ Mémento en Java Mémento en PHP Mémento en Python Mémento en Ruby Mémento en Rust Mémento en Swift Mémento en TypeScript