52 Estructura Memento
53 Colaboración (Gp:) : Guardian (Gp:) : Creador (Gp:) m : Memento (Gp:) 1. crearMemento() (Gp:) 1.1. new (Gp:) 1.2. setEstado() (Gp:) 1. setMemento(m) (Gp:) 1.1. getEstado()
Memento
54 Memento Aplicabilidad Una parte del estado de un objeto debe ser guardado para que pueda ser restaurado más tarde y una interfaz para obtener el estado de un objeto podría romper la encapsulación exponiendo detalles de implementación.
55 Memento Consecuencias Mantiene la encapsulación Simplifica la clase Creador ya que no debe preocuparse de mantener las versiones del estado interno. Podría incurrir en un considerable gasto de memoria: encapsular y restaurar el estado no debe ser costoso. Puede ser difícil en algunos lenguajes asegurar que sólo el Creador tenga acceso al estado del Memento.
56 Memento Implementación Memento tiene dos interfaces, una para los creadores y otra para el resto de clases: clases amigas en C++, exportación selectiva (Eiffel), acceso paquete en Java. Un memento puede registrar cambio incremental sobre el estado del creador: cuando se usa el patrón Command para el mecanismo undo/redo.
57 Memento (Ejemplo) package memento;
class Memento { String estado; Memento(String estadoAGuardar) { estado = estadoAGuardar; } }
package memento;
class Creador { private String estado; public Memento crearMemento() { return new Memento(estado); } public void setMemento(Memento m) { estado = m.estado; } }
58 Memento (Ejemplo) package otro;
class Guardian { private ArrayList estadosGuardados = new ArrayList(); public void addMemento (Memento m) { estadosGuardados.add(m); } public Memento getMemento (int index) { return estadosGuardados.get(index); } } package otro;
class EjemploMemento { public static void main(String[] args) { Guardian g = new Guardian(); Creador c = new Creador(); … g. addMemento(c. crearMemento()); … g. addMemento(c. crearMemento() ); … c. setMemento( g. getMemento(1) ); } }
59 Memento: Ejemplo Cursor template class Collection { IterationState* createInitialState(); void next(IterationState*); bool isDone(IterationState*); G item() (IterationState*); void append(G) void remove(G) //… }
Collection cc; IterationState* estado;
estado = cc.createInitialState();
while (!cc.isDone(estado)) { cc.item(estado)->print(); cc.next(estado)
Página anterior | Volver al principio del trabajo | Página siguiente |