Vous êtes sur la page 1sur 21

Seminario - 1

Patrones de Diseo: Memento


ndice
- Introduccin
- Presentacin del patrn
- Motivacin y aplicabilidad
- Estructura y colaboraciones
- Consecuencias
- Implementacin
- Patrones relacionados
- Ejemplo de uso del patrn
- Valoracin final
Introduccin
El patrn de diseo Memento, tambin
conocido como token esta catalogado como
patrn de comportamiento.
Introduccin
Se utiliza para guardar el estado de un objeto
simple o de un sistema completo, para poder
modificarlo y poder luego restaurar un estado
previo.
Presentacin del patrn
El propsito del patrn es representar y
externalizar el estado interno de un objeto sin
violar la encapsulacin, de forma que este,
pueda volver a dicho estado ms tarde.
Motivacin
A veces es necesario guardar el estado interno
de un objeto. Este problema se puede
solucionar con el patrn Memento.
Aplicabilidad
- Hay que guardar una instantnea del estado
de un objeto (o de parte de ste) para que
pueda volver posteriormente a ese estado
- Una interfaz directa para obtener el estado
exponga detalles de implementacin y
rompe la encapsulacin del objeto
Estructura
Colaboraciones
Consecuencias
- Preservacin de los lmites de la
encapsulacin.
- Simplifica al Creador.
- El uso de mementos puede ser costoso.
- Definicin de interfaces reducidas y amplias.
- Costes ocultos en el cuidado de los
mementos.
Implementacin
stas son dos cuestiones a considerar a la
hora de implementar el patrn Memento:
- Soporte del lenguaje.
- Guardar slo los cambios incrementales
Patrones relacionados
- Patrn Command.
- Patrn Iterator.
Ejemplo Simple de Aplicacin
-Somos los administradores de una pequea
base de datos de clientes, para mejorar la
base de datos, dicha empresa nos solicita
realizar backups de la base de datos para que
en caso de que ocurra cualquier problema la
prdida de informacin sea mnima.
Objetivo
- Almacenar los diferentes momentos de
nuestra base de datos
Registro.java
public class Registro {
//Atributos
private String nombre;
private int edad;
private boolean esActivo;
//Constructor
public Registro(String nombre, int edad, boolean esActivo){ ... }
//toString
public String toString() { ... }
}
BaseDatos.java
public class BaseDatos {
private ArrayList<Registro> listado;
private Memento memento;
//Constructor
public BaseDatos(){ ... }
public void agregarRegistro(String nombre, int ...){
Registro aux = new Registro(nombre,edad,esActivo);
listado.add(aux);
}
public void borrarBaseDatos(){
listado.clear();
}
public void mostrarListado(){
//Imprime todos los registros por pantalla si lo hay.
}
public void generarBackup(){
memento.setBackup(listado);
}
public void getBackup(int i){
listado = new ArrayList<Registro>();
for(Registro reg: memento.getBackup(i))
listado.add(reg);
}
public int getTamanyoBackup(){
return memento.getSize();
}
Memento.java
public class Memento {
private ArrayList<ArrayList<Registro>> backup;

public Memento(){ ... }
public void setBackup(ArrayList<Registro> listado){
ArrayList<Registro> lista = new ArrayList<Registro>();
for(Registro aux: listado)
lista.add(aux);
backup.add(lista);
}
public ArrayList<Registro> getBackup(int i){
return backup.get(i);
}

public int getSize(){
return backup.size();
}
Programa Principal
public class PruebaMemento {
public static void main(String[] args) {
BaseDatos bd = new BaseDatos();

//Aadimos registros y hacemos una backup (Primera).
bd.agregarRegistro("Pepito", 23, true);
bd.agregarRegistro("Antonia", 19, true);
bd.generarBackup();
//Aadimos registros y hacemos otra backup (Segunda).
bd.agregarRegistro("Ana", 28, true);
bd.agregarRegistro("Jose", 25, false);
bd.generarBackup();

//Aadimos registros y sacamos la ltima backup bd.
agregarRegistro("Toni", 14, false);
bd.agregarRegistro("Maria", 35, true);
bd.generarBackup();

do{
mostrarMenu();
opcion=teclado.nextInt();
switch(opcion){
case 1:
bd.mostrarListado();
break;
case 2:
bd.borrarBaseDatos();
break;
case 3:
muestraBackup(bd.getTamanyoBackup());
bd.getBackup(teclado.nextInt()-1);
break;
default:
System.out.println("No ha pulsado una opcion valida.");
}
}while(opcion!=0);
Ejecucin
*******************************************************
* SELECCIONA LA OPCION DESEADA *
* 1- ListarBD 2-LimpiarBD 3-Recuperar Backup *
*******************************************************
1
Registro [nombre=Pepito, edad=23, esActivo=true ]
Registro [nombre=Antonia, edad=19, esActivo=true ]
Registro [nombre=Ana, edad=28, esActivo=true ]
Registro [nombre=Jose, edad=25, esActivo=false ]
Registro [nombre=Toni, edad=14, esActivo=false ]
Registro [nombre=Maria, edad=35, esActivo=true ]
*******************************************************
* SELECCIONA LA OPCION DESEADA *
* 1- ListarBD 2-LimpiarBD 3-Recuperar Backup *
*******************************************************
2
*******************************************************
* SELECCIONA LA OPCION DESEADA *
* 1- ListarBD 2-LimpiarBD 3-Recuperar Backup *
*******************************************************
1
La base de datos est vacia!!!
*******************************************************
* SELECCIONA LA OPCION DESEADA *
* 1- ListarBD 2-LimpiarBD 3-Recuperar Backup *
*******************************************************
3
Existen 3 backups.
Escoge la backup que deseas cargar:
2
*******************************************************
* SELECCIONA LA OPCION DESEADA *
* 1- ListarBD 2-LimpiarBD 3-Recuperar Backup *
*******************************************************
1
Registro [nombre=Pepito, edad=23, esActivo=true ]
Registro [nombre=Antonia, edad=19, esActivo=true ]
Registro [nombre=Ana, edad=28, esActivo=true ]
Registro [nombre=Jose, edad=25, esActivo=false ]
Valoracin solucin
+ Damos una posible solucin al problema, generando copias de seguridad
en diferentes momentos de la base de datos.
+ La implementacin de la clase Memento es independiente a la base de
datos pudiendo cambiarla si fuera necesario.
- La clase Memento se puede desbordar de tamao, si guardamos muchos
estados y de gran tamao de la base de datos, puede suponer un gran
inconveniente y no resultar una buena solucin.
FIN

Vous aimerez peut-être aussi