El patrón Memento permite guardar y restaurar el estado interno de un objeto de forma que se preserve el encapsulamiento. Se utiliza cuando se necesita guardar estados temporales de un objeto para poder restaurarlos más tarde, como en operaciones de deshacer. La clase Memento almacena el estado del objeto Originator de forma que solo este pueda leerlo. La clase Caretaker se encarga de almacenar los objetos Memento sin necesitar conocer su contenido.
2. Frecuentemente los desarrolladores necesitan guardar el estado de un objeto para recuperarlo más tarde. Esto claro, sin perder el encapsulamiento del objeto. Una de las maneras de hacerlo, es utilizando el patrón de diseño Memento . En esta presentación vamos a ver como funciona, y un ejemplo práctico . PATRONES MEMENTO
3. Propósito El objetivo principal de Memento es guardar el estado de un objeto sin romper el encapsulamiento del mismo. PATRONES MEMENTO
12. Ejemplo Un ejemplo donde se guarda temporalmente el estado de un perspectiva de venta, para después recuperarlo La idea es tener una clase PersVenta que seria la Originator, es decir la que crea y usa el Memento Una clase MemoriaPerspectiva que seria la CareTaker, es decir el responsable de la custodia del Memento Una clase Memento, que como dice el nombre es el Memento PATRONES MEMENTO
13. public class PersVenta{ private String nombre, telefono; private double presupuesto; public void setNombre(String nombre){ System.out.println(" Nombre "+ nombre); this .nombre = nombre; } public void setTelefono(String telefono){ System.out.println(" Telefono : "+ telefono); this .telefono = telefono; } public void setPresupuesto(double presupuesto){ System.out.println(" Presupuesto : "+ presupuesto); this .presupuesto = presupuesto; } Clase Originator Propiedades del estado con métodos set PATRONES MEMENTO
14. . . . . public String getNombre(){ return nombre; } public String getTelefono() { return telefono;} public Double getPresupuesto() { return presupuesto;} public Memento SalvaMemento(){ System.out.println(" Salvando estado -- "); return new Memento(nombre,telefono,presupuesto); } public void RestauraMemento(Memento memento){ System.out.println(" Restaurando estado -- "); this .setNombre(memento.getNombre()); this .setTelefono(memento.getTelefono()); this .setPresupuesto(memento.getPresupuesto()); } } Propiedades del estado con métodos get Crea el Memento Restaura el Memento MEMENTO PATRONES
15. Clase Memento que guarda el estado del Objeto public class Memento{ private String nombre; private String telefono; private double presupuesto; public Memento(String nombre, String telefono, double presupuesto){ this .nombre = nombre; this .telefono = telefono; this .presupuesto = presupuesto; } Mismas propiedades del Objeto a guardar Constructor de la Clase PATRONES MEMENTO
16. . . . . public void setNombre(String nombre){ this .nombre = nombre; } public void setTelefono(String telefono){ this .telefono = telefono; } public void setPresupuesto(double presupuesto){ this .presupuesto = presupuesto; } public String getNombre(){ return nombre; } public String getTelefono() { return telefono;} public Double getPresupuesto() { return presupuesto;} } Métodos set() y get() del Memento PATRONES MEMENTO
17. public class MemoriaPerspectiva{ private Memento memento; public void setMemento (Memento memento){ this.memento = memento; } public Memento getMemento (){ return memento;} } Clase Caretaker, es la que cuida el Memento PATRONES MEMENTO
18. public class MainApp{ public static void main(String[] args){ PersVenta pv = new PersVenta(); pv.setNombre(" Camilo "); pv.setTelefono(" 316 7985 "); pv.setPresupuesto(15000); MemoriaPerspectiva m = new MemoriaPerspectiva(); m.setMemento(pv.SalvaMemento()); pv.setNombre(" Andres "); pv.setTelefono(" 314 5485 "); pv.setPresupuesto(18000); pv.RestauraMemento(m.getMemento()); } } Para finalizar la Clase donde está el Main() Crea un Objeto de perspectiva de venta y le introduce propiedades Guarda el estado Vuelve y cambia el Originador Restaura el estado guardado PATRONES MEMENTO
19. La salida del programa anterior sería: PATRONES MEMENTO