1. ¿Qué es el Patrón Memento
El Patrón Memento es un patrón de diseño conductual utilizado para guardar y restaurar el estado interno de un objeto. Guarda el estado del objeto en un objeto memento, que puede ser utilizado para restaurar el objeto a un estado anterior en el futuro.
2. Características y Ventajas del Patrón Memento
Las características y ventajas del Patrón Memento incluyen:
- Puede guardar y restaurar el estado interno de un objeto sin violar el principio de encapsulamiento.
- Puede gestionar de manera flexible los estados históricos de un objeto, facilitando la realización de operaciones de deshacer y rehacer.
- Permite que el estado sea guardado externamente, evitando la exposición del estado interno del objeto.
3. Ejemplos de Aplicaciones Prácticas del Patrón Memento
El Patrón Memento tiene muchos escenarios de aplicación práctica, algunos ejemplos incluyen:
- La funcionalidad de deshacer y rehacer en editores de texto, que puede utilizar el Patrón Memento para guardar el estado de cada operación.
- La funcionalidad de guardar y cargar en juegos, que puede utilizar el Patrón Memento para guardar el progreso del juego.
- La característica de almacenamiento de borradores en clientes de correo electrónico, que puede utilizar el Patrón Memento para guardar el estado de correos electrónicos en borrador.
4. Implementación del Patrón Memento en Golang
4.1. Diagrama de Clase UML
4.2. Introducción al Ejemplo
Descripción Basada en el Diagrama de Clase UML
En este ejemplo, tenemos una clase Originator con un estado interno llamado "state". El Originator establece el estado utilizando el método SetState y crea un objeto memento utilizando el método CreateMemento. El estado interno del objeto memento es el mismo que el del Originator. La clase Caretaker es responsable de almacenar el objeto memento y agregar mementos utilizando el método AddMemento.
Pasos de Implementación
- Crear el objeto Memento, que tiene un método GetState para guardar el estado interno del Originator.
- Crear el objeto Originator, que tiene métodos para establecer el estado y crear un memento.
- Crear el objeto Caretaker, que es responsable de guardar el objeto memento.
- Implementar los métodos para crear un memento y restaurar el estado en el Originator:
- Al crear un objeto memento, guardar el estado del Originator en el memento.
- Al restaurar el estado, restaurar el estado del memento al Originator.
- Implementar los métodos para añadir un memento y obtener un memento en el Caretaker:
- El método add memento se utiliza para guardar el objeto memento en el Caretaker.
- El método get memento se utiliza para recuperar el objeto memento del Caretaker.
4.3.1. Crear un Objeto Memento
type Memento struct {
state string
}
func (m *Memento) GetState() string {
return m.state
}
4.3.2. Almacenar Estado en el 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. Restaurar Estado desde el Memento
func (o *Originator) SetMemento(memento *Memento) {
o.state = memento.GetState()
}
4.3.4. Uso del Patrón Memento para Operaciones de Deshacer
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. Uso del patrón Memento para operaciones de rehacer
func main() {
originator := &Originator{}
caretaker := &Caretaker{}
originator.SetState("Estado 1")
caretaker.AddMemento(originator.CreateMemento())
originator.SetState("Estado 2")
caretaker.AddMemento(originator.CreateMemento())
originator.SetMemento(caretaker.GetMemento(0))
fmt.Println("Estado del originador después de restaurar al estado 1:", originator.state)
originator.SetMemento(caretaker.GetMemento(1))
fmt.Println("Estado del originador después de restaurar al estado 2:", originator.state)
}