Design Patterns in Go
  • Portada
  • Introducción
  • Publicación
  • Parte I
    • Sobre Go
    • POO en Go
      • Objetos
      • Herencia / Composición
      • S.O.L.I.D
  • Parte II
    • Patrones de Diseño
      • GoF
      • Patrones de Comportamiento
        • Strategy
        • Chain of Responsibility
        • Command
        • Template Method
        • Memento
        • Interpreter
        • Iterator
        • Visitor
        • State
        • Mediator
        • Observer
      • Patrones Creacionales
        • Singleton
        • Builder
        • Factory Method
        • Abstract Factory
        • Prototype
      • Patrones Estructurales
        • Composite
        • Adapter
        • Bridge
        • Proxy
        • Decorator
        • Facade
        • Flyweight
  • Parte III
    • Conclusiones
    • Acerca De
  • Recursos de interés
  • Glosario
Con tecnología de GitBook
En esta página
  • Propósito
  • También conocido como
  • Estructura
  • Participantes
  • Implementación
  • Código de ejemplo

¿Te fue útil?

  1. Parte II
  2. Patrones de Diseño
  3. Patrones de Comportamiento

Memento

AnteriorTemplate MethodSiguienteInterpreter

Última actualización hace 5 años

¿Te fue útil?

Propósito

Según el libro "Patrones de Diseño" el patrón Memento "representa y externaliza el estado interno de un objeto sin violar la encapsulación, de forma que este puede volver a dicho estado más tarde".

También conocido como

Token

Estructura

Participantes

  • Memento:

    • guarda el estado interno de la variable Creador. El memento puede guardar tanta información del estado interno del creador como sea necesario a discreción del creador.

    • protege frente a accesos de otras variables que no sean el creador. Los mementos tienen realmente dos interfaces. El Conserje va una interfaz reducida del memento - solo puede pasar el memento a otras variables -. El Creador, por el contrario, ve una interfaz amplia, que le permite acceder a todos los datos necesarios para volver a su estado anterior. Idealmente, solo el creador que produjo el memento estaría autorizado a acceder al estado interno de este.

  • Creador:

    • crea un memento que contiene una instantánea de su estado interno actual.

    • usa el memento para volver a su estado anterior.

  • Conserje:

    • es responsable de guardar en lugar seguro el memento.

    • nunca examina los contenidos del memento, ni opera sobre ellos.

Implementación

No se observan impedimentos y/o modificaciones de la estructura original del patrón para su implementación en Go.

Código de ejemplo

En este ejemplo queremos que un editor de texto tenga la posibilidad de volver atrás su estado luego de una actualización de contenido.

Implementación:

// Interface
type Memento interface {
    SetContenido(string)
    GetContenido() string
}

// Memento
type EditorMemento struct {
     contenido string
}

func (em *EditorMemento) SetContenido(contenido string) {
    em.contenido = contenido
}

func (em *EditorMemento) GetContenido() string {
    return em.contenido
}

// Originador
type Editor struct {
    contenido string
}

func (e *Editor) VerContenido() string {
    return e.contenido
}

func (e *Editor) Escribir(texto string) {
    e.contenido = e.contenido + " " + texto
}

func (e *Editor) Guardar() Memento {
    editorMemento := &EditorMemento{}
    editorMemento.SetContenido(e.contenido)

    return editorMemento
}

func (e *Editor) Restaurar(memento Memento) {
    e.contenido = memento.GetContenido()
}

Se puede probar la implementación del patrón de la siguiente forma:

editor := &Editor{}
editor.Escribir("TextoA")
editor.Escribir("TextoB")
fmt.Printf("El editor contiene:%s\n", editor.VerContenido())

fmt.Println("Se guarda el estado actual")
memento := editor.Guardar()

fmt.Println("Se escribe unnuevo contenido")
editor.Escribir("TextoC")

fmt.Printf("El editor ahora contiene:%s\n", editor.VerContenido())

fmt.Println("Se restaura el contenido guardado")
editor.Restaurar(memento)

fmt.Printf("El editor nuevamente contiene:%s\n", editor.VerContenido())

|

Atención: Esta publicación se encuentra abandonada. Puede acceder a la versión vigente en

Código de ejemplo
Ejecutar código
https://leanpub.com/designpatternsingo
[29]