Memento
O Memento é um padrão comportamental utilizado para salvar e restaurar o estado anterior de um objeto sem expor seus detalhes internos.
É muito utilizado para implementar:
Undo
Histórico
Snapshots
Rollback
Imagine um editor de texto.
O usuário escreve:
Olá
Depois:
Olá mundo
E finalmente:
Olá mundo!
Se o usuário clicar em Ctrl + Z, precisamos restaurar um estado anterior.
Implementação
Nosso objeto:
class Editor {
private content = "";
write(text: string) {
this.content += text;
}
getContent() {
return this.content;
}
save() {
return new EditorMemento(
this.content
);
}
restore(
memento: EditorMemento
) {
this.content =
memento.getContent();
}
}
O Memento:
class EditorMemento {
constructor(
private content: string
) {}
getContent() {
return this.content;
}
}
Agora podemos salvar:
const editor =
new Editor();
editor.write("Olá");
const snapshot =
editor.save();
Alteramos:
editor.write(
" mundo"
);
Estado:
Olá mundo
Podemos restaurar:
editor.restore(
snapshot
);
Resultado:
Olá
Histórico
Podemos armazenar vários Mementos:
const history:
EditorMemento[] = [];
history.push(
editor.save()
);
editor.write(
"Olá mundo"
);
history.push(
editor.save()
);
editor.write("!");
history.pop();
editor.restore(
history[history.length - 1]
);
Isso permite criar sistemas de histórico.
Exemplo real: Jogos
Imagine um jogo:
Estado atual
↓
Salvar
↓
Jogar
↓
Morrer
↓
Carregar Save
O Memento pode armazenar:
{
level: 5,
health: 80,
coins: 300,
position: {
x: 100,
y: 200
}
}
O jogo pode restaurar o estado anterior.
Quando usar?
Memento é útil para:
- Undo/Redo.
- Histórico de alterações.
- Save games.
- Snapshots.
- Rollback.
A ideia principal é:
Capturar o estado de um objeto para que ele possa ser restaurado posteriormente.