Salut, je viens de réduire le prix de tous les produits. Préparons nos compétences en programmation pour l'ère post-COVID. Plus de détails »
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

Patrons de conception : Mémento en Java Patrons de conception : Mémento en C# Patrons de conception : Mémento en C++ Patrons de conception : Mémento en PHP Patrons de conception : Mémento en Python Patrons de conception : Mémento en Ruby Patrons de conception : Mémento en Swift Patrons de conception : Mémento en TypeScript