Padrão Memento: Preservação do Estado das Aplicações

Ildeberto Vasconcelos
3 min readJan 3, 2024

--

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.

--

--

Ildeberto Vasconcelos
Ildeberto Vasconcelos

Written by Ildeberto Vasconcelos

📱Flutter & Dart 🚀💻 Turning ideas into powerful applications.💡🔥 #Flutter | .NET

No responses yet