Eh, acabo de reducir el precio de todos los productos. Preparemos nuestras habilidades de programación para la era posterior a la COVID. Más detalles »
Memento

Memento en Go

Memento es un patrón de diseño de comportamiento que permite tomar instantáneas del estado de un objeto y restaurarlo en el futuro.

El patrón Memento no compromete la estructura interna del objeto con el que trabaja, ni la información que se encuentra dentro de las instantáneas.

Ejemplo conceptual

El patrón Memento nos permite guardar instantáneas del estado de un objeto. Puedes emplear estas instantáneas para revertir el objeto al estado previo. Resulta de utilidad cuando tienes que implementar operaciones de deshacer-rehacer en un objeto.

originator.go: Originador

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: Memento

package main

type memento struct {
	state string
}

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

caretaker.go: Cuidador

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: Código cliente

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: Resultado de la ejecución

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

Memento en otros lenguajes

Patrones de diseño: Memento en Java Patrones de diseño: Memento en C# Patrones de diseño: Memento en C++ Patrones de diseño: Memento en PHP Patrones de diseño: Memento en Python Patrones de diseño: Memento en Ruby Patrones de diseño: Memento en Swift Patrones de diseño: Memento en TypeScript