Memento - Patrones de diseño

A
Antonio Leiva
4 min lectura

El patrón de diseño Memento es un patrón de comportamiento que se utiliza para permitir a un objeto volver a un estado anterior sin violar el principio de encapsulamiento.

Este patrón se utiliza a menudo en aplicaciones donde es necesario revertir un cambio o restaurar un objeto a un estado anterior.

Por ejemplo, en un editor de texto, podemos utilizar el patrón Memento para deshacer y rehacer cambios en un documento.

En Kotlin, podemos implementar el patrón Memento mediante la creación de una clase Memento que almacena el estado de un objeto y una clase Caretaker que se encarga de crear y restaurar el estado del objeto mediante la clase Memento.

Ejemplo de Memento: Editor de texto

Por ejemplo, supongamos que tenemos una clase Editor que representa un editor de texto y tiene una propiedad de texto que almacena el contenido del documento. Podemos implementar el patrón Memento de la siguiente manera:

class Memento(val text: String)

class Caretaker {
    private val mementos = mutableListOf<Memento>()

    fun save(editor: Editor) {
        mementos.add(Memento(editor.text))
    }

    fun restore(editor: Editor) {
        editor.text = mementos.last().text
    }
}

class Editor {
    var text = ""
    val caretaker = Caretaker()

    fun write(text: String) {
        this.text = text
    }

    fun save() {
        caretaker.save(this)
    }

    fun restore() {
        caretaker.restore(this)
    }
}

En este ejemplo, la clase Memento simplemente almacena el estado de un objeto Editor mediante la propiedad de texto. La clase Caretaker se encarga de crear una instancia de Memento y almacenarla en una lista cada vez que se llama al método save() del objeto Editor.

Para restaurar el estado anterior, el método restore() de la clase Caretaker obtiene el último Memento de la lista y establece la propiedad de texto del objeto Editor en el valor almacenado en el Memento.

Con esta implementación, podemos utilizar el patrón Memento en nuestra aplicación de la siguiente manera:

val editor = Editor()

editor.write("Texto inicial")
editor.save()

editor.write("Cambio 1")
editor.save()

editor.write("Cambio 2")

println(editor.text) // "Cambio 2"

editor.restore()

println(editor.text) // "Cambio 1"

Ejemplo de Memento: Estado de un juego

Además de su uso en editores de texto, el patrón Memento también se puede utilizar en aplicaciones de juegos para guardar y restaurar el estado de un juego. Por ejemplo, podemos utilizar el patrón Memento para guardar y restaurar el estado de un juego de ajedrez.

En Kotlin, podemos implementar el patrón Memento en un juego de ajedrez de la siguiente manera:

class Memento(val board: List<List<Piece>>)

class Caretaker {
    private val mementos = mutableListOf<Memento>()

    fun save(game: ChessGame) {
        mementos.add(Memento(game.board))
    }

    fun restore(game: ChessGame) {
        game.board = mementos.last().board
    }
}

class ChessGame {
    var board = List(8) { List(8) { EmptyPiece } }
    val caretaker = Caretaker()

    fun makeMove(from: Pair<Int, Int>, to: Pair<Int, Int>) {
        // Mover pieza en el tablero
    }

    fun save() {
        caretaker.save(this)
    }

    fun restore() {
        caretaker.restore(this)
    }
}

En este ejemplo, la clase Memento almacena el estado del tablero del juego de ajedrez mediante la propiedad board. La clase Caretaker se encarga de crear una instancia de Memento y almacenarla en una lista cada vez que se llama al método save() del objeto ChessGame.

Para restaurar el estado anterior, el método restore() de la clase Caretaker obtiene el último Memento de la lista y establece la propiedad board del objeto ChessGame en el valor almacenado en el Memento.

De esta manera, podemos utilizar el patrón Memento en nuestro juego de ajedrez para guardar y restaurar el estado del juego en cualquier momento.

Conclusión

En conclusión, el patrón de diseño Memento es un patrón de diseño de comportamiento que se utiliza para permitir a un objeto volver a un estado anterior sin violar el principio de encapsulamiento.

En Kotlin, podemos implementar este patrón mediante la creación de una clase Memento que almacena el estado de un objeto y una clase Caretaker que se encarga de crear y restaurar el estado del objeto a través de la clase Memento.

Este patrón es útil en aplicaciones donde es necesario revertir cambios o restaurar un objeto a un estado anterior.