Memento – Patrones de diseño
Antonio Leiva

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.

Quizá también te interese…

Las reglas FIRST de los tests

Las reglas FIRST de los tests

Las reglas FIRST son un conjunto de principios que se utilizan para diseñar y escribir tests de software de manera efectiva. Las siglas FIRST significan: F - Fast: Un test debe ser rápido de ejecutar. I - Independent: Un test debe ser independiente de otros tests y...

¿Qué son los dobles de test?

¿Qué son los dobles de test?

Los dobles de prueba (también conocidos como "doubles" o "fakes") son herramientas comunes en la programación y en particular en el testing de software. Se utilizan para simular el comportamiento de una dependencia de una aplicación en un entorno de pruebas, sin tener...

Kata del TicTacToe en Kotlin

Kata del TicTacToe en Kotlin

Escribe el código para representar una entidad que almacene el tablero de juego del 3 en raya, y que además tenga: Un método move() con 2 parámetros, fila y columna, que permita añadir un movimiento al tablero Un método findWinner(), que devuelva el ganador (X, Y o...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de DevExpert, S.L.U., con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *