Lista de Exercícios 019: Memento
Exercício 1 : Situações para análise
Seção intitulada “Exercício 1 : Situações para análise”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.
- 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.
- Situação 2: uma classe
Calculadoraexecuta apenas soma e multiplicação pontuais, sem histórico nem necessidade de restaurar estados anteriores. - 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.
- 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.
- 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.
Exercício 2 : Código com problema
Seção intitulada “Exercício 2 : Código com problema”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.
Exercício 3 : Múltipla escolha
Seção intitulada “Exercício 3 : Múltipla escolha”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.
Exercício 4 : Implementação simples
Seção intitulada “Exercício 4 : Implementação simples”Implemente uma solução simples usando Memento para representar um editor de feedback em um sistema acadêmico.
- Crie uma classe
EditorFeedbackcom campos comotextoecursor. - Adicione um método para alterar o texto.
- Crie uma classe
Snapshotpara 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
HistoricoFeedbackpara guardar snapshots em pilha. - No
main, demonstre um fluxo com salvar, alterar e desfazer.