51
Memento
Propósito
Captura y externaliza el estado interno de un objeto, sin violar la encapsulación, de modo que el objeto puede ser restaurado a este estado más tarde.
Motivación
Algunas veces es necesario registrar el estado interno de un objeto: mecanismos checkpoints y deshacer cambios que permiten probar operaciones o recuperación de errores.
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 |