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.
0 comentarios