Descargar

Patrones de Comportamiento del Software (página 4)

Enviado por Pablo Turmero


Partes: 1, 2, 3, 4
edu.red 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.

edu.red 52 Estructura Memento

edu.red 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

edu.red 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.

edu.red 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.

edu.red 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.

edu.red 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; } }

edu.red 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) ); } }

edu.red 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)

Partes: 1, 2, 3, 4
 Página anterior Volver al principio del trabajoPágina siguiente