Pular para o conteúdo

Lista de Exercícios 019: Memento

Analise cada situação e diga se o padrão Memento é ou não uma boa escolha. Em cada caso, classifique como adequada ou não adequada e justifique brevemente.

  1. Situação 1: um editor de texto precisa permitir que o usuário desfaça as últimas alterações sem expor diretamente todos os campos internos do documento.
  2. Situação 2: uma classe Calculadora executa apenas soma e multiplicação pontuais, sem histórico nem necessidade de restaurar estados anteriores.
  3. Situação 3: um sistema de workflow precisa voltar ao estado anterior de um formulário quando uma validação crítica falha durante o processamento.
  4. Situação 4: um serviço consulta dados externos e pode simplesmente fazer uma nova requisição quando precisar do valor mais recente, sem manter histórico local.
  5. Situação 5: um jogo precisa salvar checkpoints com posição, inventário e progresso do jogador para restaurar o ponto anterior após derrota.

Leia o código abaixo, identifique o problema conceitual relacionado ao encapsulamento e sugira como melhorá-lo em alto nível usando Memento.

class Editor {
public String texto;
public int cursor;
public void escrever(String novoTexto) {
texto = novoTexto;
cursor = novoTexto.length();
}
}
class Historico {
private final List<String> textos = new ArrayList<>();
private final List<Integer> cursores = new ArrayList<>();
public void salvar(Editor editor) {
textos.add(editor.texto);
cursores.add(editor.cursor);
}
}

Considere na resposta os conceitos de originador, snapshot, cuidador, preservação do encapsulamento e responsabilidade de criar o retrato do estado.

Uma equipe quer implementar funcionalidade de desfazer em um editor de relatórios sem expor os detalhes internos do objeto Documento. Qual alternativa descreve melhor a solução?

A. Usar Memento para que o próprio Documento gere snapshots de seu estado e um histórico armazene esses snapshots.

B. Usar Facade para esconder o Documento, mas permitir que qualquer classe copie seus campos quando quiser.

C. Usar Singleton para garantir que exista apenas uma versão do documento em toda a aplicação.

D. Usar Flyweight para compartilhar o mesmo conteúdo textual entre todos os documentos editados.

Gabarito: alternativa A.

Implemente uma solução simples usando Memento para representar um editor de feedback em um sistema acadêmico.

  • Crie uma classe EditorFeedback com campos como texto e cursor.
  • Adicione um método para alterar o texto.
  • Crie uma classe Snapshot para representar o memento.
  • Faça o próprio editor gerar seu snapshot por meio de um método como salvar().
  • Faça também o editor restaurar seu estado por meio de um método como restaurar(snapshot).
  • Crie uma classe HistoricoFeedback para guardar snapshots em pilha.
  • No main, demonstre um fluxo com salvar, alterar e desfazer.