Padrão Memento: Preservação do Estado das Aplicações
O padrão Memento (Memento Pattern) é um padrão de design comportamental que visa capturar e armazenar o estado interno de um objeto . Ele permite que você salve o estado de um objeto em um ponto específico do tempo e o restaure mais tarde, se for necessário, mantendo a coerência dos dados.
é como tirar uma fotografia do estado de algo que queres lembrar mais tarde. Imagina que estás a desenhar e queres recordar como estava o desenho num certo momento. Então, tiras uma “foto” desse desenho. Mais tarde, se quiseres voltar exatamente para aquele ponto do desenho, podes olhar para essa foto e recriar o que lá estava naquele momento.
É como se fosse um botão de “voltar atrás” para um estado anterior de algo, como quando estás a jogar um videojogo e queres voltar para o ponto onde estavas antes de fazer algo que já não queres.
O bom é que essa “foto” ou “registo” não estraga NADA ou interfere no que está a acontecer naquele momento.
Componentes
A estrutura básica do padrão Memento é composta por três componentes principais:
- Originator (Originador): É o objeto cujo estado se deseja preservar. Ele cria um Memento contendo uma cópia do seu estado interno ou pode restaurar seu estado a partir de um Memento.
- Memento: É a classe que representa o estado do Originador em um determinado momento. Ela pode conter informações sobre o estado anterior do Originador.
- Caretaker (Cuidador): É responsável por guardar e gerenciar os Mementos, porém, sem modificar seu conteúdo. Ele pode guardar, recuperar ou descartar Mementos.
Quando Utilizar o Padrão Memento?
O padrão Memento é útil quando precisas guardar e recuperar o estado de objetos sem comprometer a sua organização interna, sobretudo em situações onde preservar o histórico de estados é crucial. Pode ser aplicado em editores de texto para realizar operações de “desfazer” e “refazer”, em aplicações de reprodução de media para controlar o progresso ou em jogos para guardar o estado do jogo em momentos distintos,para restaurar elementos de uma lista em caso de remoção involuntária ou arrependimento e por aí vai.
Exemplo de Implementação em Flutter/Dart
import 'package:flutter/material.dart';
// Classe Memento
class TarefaMemento {
final String tarefa;
TarefaMemento(this.tarefa);
}
// Classe Originator
class ListaDeTarefas {
List<String> tarefas = [];
TarefaMemento criarBackup() {
return TarefaMemento(tarefas.last);
}
void restaurar(TarefaMemento memento) {
tarefas.add(memento.tarefa);
}
void adicionarTarefa(String tarefa) {
tarefas.add(tarefa);
}
void removerUltimaTarefa() {
if (tarefas.isNotEmpty) {
tarefas.removeLast();
}
}
}
// Classe Caretaker
class HistoricoTarefas {
final List<TarefaMemento> historico = [];
void adicionarMemento(TarefaMemento memento) {
historico.add(memento);
}
TarefaMemento obterMemento() {
if (historico.isNotEmpty) {
final ultimoIndice = historico.length - 1;
final ultimoMemento = historico[ultimoIndice];
historico.removeLast();
return ultimoMemento;
}
return null;
}
}
void main() {
final listaDeTarefas = ListaDeTarefas();
final historico = HistoricoTarefas();
listaDeTarefas.adicionarTarefa('Comprar leite'); // Adicionando uma tarefa
listaDeTarefas.adicionarTarefa('Estudar Flutter'); // Adicionando outra tarefa
print('Tarefas atuais: ${listaDeTarefas.tarefas}');
listaDeTarefas.removerUltimaTarefa(); // Removendo a última tarefa
final tarefaRemovida = listaDeTarefas.criarBackup(); // Salvando a tarefa removida
historico.adicionarMemento(tarefaRemovida); // Guardando no histórico
print('Tarefas após remover a última: ${listaDeTarefas.tarefas}');
// Simulando o desfazer da exclusão da tarefa
final tarefaRestaurada = historico.obterMemento(); // Recuperando a tarefa removida
if (tarefaRestaurada != null) {
listaDeTarefas.restaurar(tarefaRestaurada); // Restaurando a tarefa
}
print('Tarefas após desfazer: ${listaDeTarefas.tarefas}');
}
Então quando quisers dar aos teus utilizadores a possibilidade de ‘Desfazer’ uma acção,lembra-te do Memento Pattern.