Patrón Memento con Swift

El patrón Memento es muy útil cuando se quieren preservar múltiples estados de nuestras app, normalmente modelos, para así poder volver atrás o hacia delante como si de un histórico se tratase.

Componentes del patrón Memento

El patrón se contruye usando tres componentes

  • Memento. Es la representación del estado que queremos preservar. Debe ser inmutable

  • Originator. Es quien genera o consume los Mementos.

  • CareTaker. Es el encargado de gestionar el almacenamiento de los Mementos. Los guarda y los recupera.

Para ilustrar el uso de este patrón de software vamos a simular el control del stock de alguno de los productos que podemos encontrar en la Apple Store.

Lo primero que haremos será definir el Originator de nuestro ejercicio, y lo haremos definiendo un protocolo que deberá implementar la estructura o clase que haga las veces de Originator

Este protocolo define lo mínimo que debe implementar, que es:

  • Ser capar de generar un Memento

  • Restaurar su estado a partir de un Memento dado

En este caso la propia estructura AppleStore hace esa función, por lo que sólo debe implementar el protocol mediante una extensión.

Vemos que le estructura Memento hace su aparación. Con ella podemos representar el estado del stock de la tienda en un momento dado.

El elemento que haga las veces de CareTaker debe cumplir con un mínimo de funcionalidad.

  • Guardar un memento

  • Recuperar un memento

Vamos a definirla en un protocolo, de esta manera cualquier fuente de datos que quiera hacer esta funcíon sólo tiene que implementarlo.

Ahora necesitamos una clase que implemente este protocolo y para eso tenemos nuestra clase Database

En este ejemplo nos limitamos a usar un Array como base de datos, por lo otra solución podía haber sido hacer que Arraycumpla con el protocolo CareTaker mediante una extensión.

Y ahora veamos como queda todo esto con un ejemplo

Y la salida que tenemos es…

Código fuente

Podéis encontrar el ejemplo completo en este repositorio de GitHub

QUIZÁ TE INTERESE…