MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

17
MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk

Transcript of MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Page 1: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

MEMENTO

Patrón de Comportamiento

Ana María MateoJorge P. Andrés

Victoria Pasichnyk

Page 2: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Introducción

Memento es un patrón de comportamiento, lo cual significa que esta relacionado con el flujo de control del sistema.

La forma de organizar el flujo de control puede derivar en grandes beneficios para la eficiencia y el mantenimiento del sistema.

Page 3: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Propósito Este patrón tiene como finalidad almacenar el estado

de un objeto (o del sistema completo) en un momento dado de manera que se pueda restaurar en ese punto de manera sencilla.

Para ello se mantiene almacenado el estado del objeto para un instante de tiempo en una clase independiente de aquella a la que pertenece el objeto (pero sin romper la encapsulación), de forma que ese recuerdo permita que el objeto sea modificado y pueda volver a su estado anterior.

Page 4: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

MotivaciónEl patrón Memento se usa para:

Poder restaurar el sistema desde estados pasados.

Para facilitar el hacer y deshacer de determinadas operaciones, para lo que habrá que guardar los estados anteriores de los objetos sobre los que se opere (o bien recordar los cambios de forma incremental).

Page 5: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Motivación: ejemplo ¿Cómo se deshace una operación en un

editor gráfico?

Page 6: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Motivación: ejemplo Si queremos volver al estado original

mediante cálculos geométricos, el resultado podría ser distinto al esperado.

Por ejemplo:

Page 7: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

¡¡¡Podemos conseguir una solución eficiente implementando

el comando “undo” con MEMENTO!!!

Page 8: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Estructura

Memento permite almacenar (parte de) el estado de Creador (Originator). Ofrece dos interfaces distintas: una estrecha para el Conserje (Caretaker) y una extendida para Creador.

El Creador es capaz de crear objetos Memento con información sobre su estado y restaurar éste a partir de un Memento.

El Conserje se encarga de mantener los objetos Memento y en ningún caso accede a su información interna.

Page 9: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Colaboraciones Un conserje solicita un

memento a un creador, lo almacena durante un tiempo y se lo devuelve a su creador, tal y como ilustra el diagrama de interacción.

A veces el conserje no devolverá el memento a su creador, ya que el creador podría no necesitar nunca volver a un estado anterior.

Los mementos son pasivos. Sólo el creador que creó el memento asignará o recuperará su estado.

Page 10: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Consecuencias

Mantiene la encapsulación.

Simplifica la clase Creador.

El uso de memento puede resultar costoso si se hacen muchas copias o las copias son voluminosas.

En algunos lenguajes puede no ser trivial definir dos interfaces distintas para el memento.

El objeto (conserje) que se encarga de gestionar los mementos no sabe cuánto ocupan y su almacenamiento puede provocar un coste inesperado.

Page 11: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Ejemplo de implementación

El siguiente programa en Java ilustra el uso de "undo" con el patrón Memento.

Intervienen tres clases: la clase Creador es una clase que cambia de estado; la clase Conserje se encarga de registrar los cambios del Creador; Memento guarda el objeto a salvaguardar.

Page 12: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Ejemplo: clase Memento

class Memento { private String estado;

public Memento(String estadoParaSalvar) { estado = estadoParaSalvar;

} public String getEstadoSalvado() {

return estado; }

}

Page 13: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Ejemplo: clase Creador

class Creador { private String estado;

public void set(String estado) { System.out.println(“Creador: Asignando el estado "+estado);

this.estado = estado; } public Memento salvarEnMemento() { System.out.println(“Creador: Salvando en Memento.");

return new Memento(estado); } public void restaurarDesdeMemento(Memento m) {

estado = m.getEstadoSalvado(); System.out.println(“Creador: Estado después de restaurar

desde Memento: "+estado); }

}

Page 14: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Ejemplo: clase Conserje

class Conserje { private ArrayList<Memento> estadosSalvados = new

ArrayList<Memento>();

public void añadirMemento(Memento m) { estadosSalvados.add(m);

} public Memento getMemento(int indice) {

return estadosSalvados.get(indice); }

}

Page 15: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Ejemplo: main

class MementoEjemplo { public static void main(String[] args) {

Conserje conserje = new Conserje(); Creador creador = new Creador(); creador.set(“Estado1"); creador.set(“Estado2"); conserje.añadirMemento(creador.salvarEnMemento());

creador.set(“Estado3"); conserje.añadirMemento(creador.salvarEnMemento());

creador.set(“Estado4");creador.restaurarDesdeMemento(conserje.getMemento(1));

}}

Page 16: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Ejemplo: resultado de la ejecución

La salida por pantalla es: Creador : Asignando el estado Estado1

Creador : Asignando el estado Estado2 Creador : Salvando en Memento. Creador : Asignando el estado Estado3 Creador : Salvando en Memento. Creador : Asignando el estado Estado4 Creador : Estado después de restaurar desde

Memento : Estado3

Page 17: MEMENTO Patrón de Comportamiento Ana María Mateo Jorge P. Andrés Victoria Pasichnyk.

Conclusión

Utilizando el patrón Memento se puede encapsular el estado interno de un objeto en otro objeto distinto, y encapsularlo de forma que ese segundo objeto sólo pueda ser utilizado por el objeto que lo creó.