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

Post on 23-Jan-2016

215 views 0 download

Transcript of 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

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.

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.

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).

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

editor gráfico?

Motivación: ejemplo Si queremos volver al estado original

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

Por ejemplo:

¡¡¡Podemos conseguir una solución eficiente implementando

el comando “undo” con MEMENTO!!!

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.

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.

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.

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.

Ejemplo: clase Memento

class Memento { private String estado;

public Memento(String estadoParaSalvar) { estado = estadoParaSalvar;

} public String getEstadoSalvado() {

return estado; }

}

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); }

}

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); }

}

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));

}}

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

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ó.