Memento - Patrones de diseño

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.
Cómo conseguir la localización amplia en Android
Cómo pedir permisos en Jetpack Compose