Este artigo ou sección precisa dunha revisión do formato que siga o libro de estilo da Galipedia. Pode axudar a mellorar este artigo e outros en condicións semellantes. |
Este artigo ou sección precisa dunha revisión ortográfica e/ou de gramática (recurso útil: corrector ortográfico en liña de galego). Podes axudarte do revisor ortográfico, activándoo en: Preferencias → Trebellos → Navegación → Ortografía: Activar o revisor ortográfico. Colabora connosco neste artigo e noutros en condicións semellantes para que a Galipedia mellore e medre. |
O padrón de deseño Memento (ou Lembranza ou Token) é un padrón de comportamento que permite capturar e extraer o estado interno dun obxecto, respectando a súa encapsulación, de xeito que, posteriormente, aínda que se modifique o obxecto, se poida restaurar ese estado.
Para permitir funcionalidades como desfacer unha acción ou, en caso de erro, volver a un estado consistente, é necesario gardar o estado interno dun obxecto. O padrón Memento permite levar isto a cabo sen romper a encapsulación dos obxectos.
Por exemplo, no caso dun editor gráfico que permita conectar figuras. Dados dous rectángulos que se poden conectar mediante unha liña, o editor permite que, aínda que despracemos os rectángulos, a liña modifique a súa lonxitude co fin de que os rectángulos permanezan sempre conectados. Cando se quere volver a unha posición anterior non é tan fácil como parece. Pódese dar o caso de que ó desfacer unha acción non restauremos a posición inicial, ou que non se produza o efecto desexado. Este problema pode resolverse empregando o padrón Memento. A opción de desfacer solicitará un Recordo ó Creador cando necesite comprobar o seu estado. O Creador inicializa o memento coa información do estado actual. E só o Creador pode almacenar e recuperar a información do Recordo.
Emprégase o padrón Memento cando o estado dun obxecto debe ser almacenado de modo que poida ser recuperado e restaurado noutro momento futuro, ou ben cando unha interface para obter o estado rompa a encapsulación do obxecto expoñendo detalles da súa implementación.
public class Memento {
Memento() { _estado = new java.util.Hashtable(); }
void garda(String attr, Object valor) { _estado.put(attr, valor); }
Object recupera(String attr, Object defecto) {
return _estado.containsKey(attr) ? _estado.get(attr) : defecto;
}
private java.util.Hashtable _estado;
}
public class ObxectoComplexo {
public Memento crearMemento() {
Memento estadoActual = new Memento();
estadoActual.guarda(NOME, _nome);
estadoActual.guarda(UNENTEIRO, new Integer(_unEnteiro));
estadoActual.guarda(COLECCIÓN, _colección.clone());
return estadoActual;
}
public void restaurar(Memento previo) {
_nombre = (String) previo.recupera(NOME, _nome);
_colección = (java.util.Vector) previo.recupera(COLECCIÓN, _coleccion);
Integer i = (Integer) previo.recupera(UNENTEIRO, new Integer(_unEnteiro));
_unEnteiro = i.intValue();
}
public Memento cambiarNome(String nome) {
Memento recordo = new Memento();
recordo.guarda(NOME, _nome);
_nome = nome;
return recordo;
}
// máis métodos que modifican o estado do obxecto...
private String _nome;
private static final String NOME = "exemplo.ObxectoComplexo._nome";
private int _unEnteiro;
private static final String UNENTEIRO = "exemplo.ObxectoComplexo._unEnteiro";
private java.util.Vector _colección = new java.util.Vector();
private static final String COLECCIÓN = "exemplo.ObxectoComplexo._colección";
}