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