"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Compreendendo o padrão de design Memento em Java

Compreendendo o padrão de design Memento em Java

Publicado em 2024-08-07
Navegar:181

Understanding the Memento Design Pattern in Java

Problema

O padrão Memento atende à necessidade de capturar e restaurar o estado interno de um objeto sem violar seu encapsulamento. Isso é útil em cenários onde você deseja implementar a funcionalidade de desfazer/refazer, permitindo que um objeto reverta para um estado anterior.

Solução

O padrão Memento envolve três componentes principais:

  1. Originador: O objeto cujo estado interno precisa ser salvo e restaurado.
  2. Memento: Um objeto que armazena o estado interno do originador. A lembrança é imutável.
  3. Caretaker: Responsável por solicitar ao originador que salve ou restaure seu estado a partir de uma lembrança.

O originador cria uma lembrança contendo um instantâneo de seu estado atual. Esta lembrança pode então ser armazenada pelo zelador e usada para restaurar o estado do originador quando necessário.

Prós e contras

Prós

  • Preserva o encapsulamento: Permite que o estado interno de um objeto seja salvo e restaurado sem expor seus detalhes de implementação.
  • Desfazer/Refazer Simples: Facilita a implementação da funcionalidade de desfazer/refazer, tornando o sistema mais robusto e fácil de usar.
  • Histórico de estados: Permite manter um histórico dos estados anteriores do objeto, possibilitando a navegação entre diferentes estados.

Contras

  • Consumo de memória: Armazenar vários mementos pode consumir memória significativa, especialmente se o estado do objeto for grande.
  • Complexidade Adicional: Introduz complexidade adicional ao código, com a necessidade de gerenciar a criação e restauração de mementos.
  • Responsabilidade do zelador: O zelador precisa gerenciar lembranças de forma eficiente, o que pode adicionar responsabilidade e complexidade ao sistema.

Exemplo de aplicação no mundo real

Um exemplo prático do padrão Memento está em editores de texto que oferecem funcionalidade de desfazer/refazer. Cada alteração no documento pode ser salva como uma lembrança, permitindo ao usuário reverter aos estados anteriores do documento conforme necessário.

Código de exemplo em Java

Padrão Memento no código:

// Originator
public class Editor {
    private String content;

    public void setContent(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public Memento save() {
        return new Memento(content);
    }

    public void restore(Memento memento) {
        content = memento.getContent();
    }

    // Memento
    public static class Memento {
        private final String content;

        public Memento(String content) {
            this.content = content;
        }

        private String getContent() {
            return content;
        }
    }
}

// Caretaker
public class History {
    private final Stack history = new Stack();

    public void save(Editor editor) {
        history.push(editor.save());
    }

    public void undo(Editor editor) {
        if (!history.isEmpty()) {
            editor.restore(history.pop());
        }
    }
}

// Client code
public class Client {
    public static void main(String[] args) {
        Editor editor = new Editor();
        History history = new History();

        editor.setContent("Version 1");
        history.save(editor);
        System.out.println(editor.getContent());

        editor.setContent("Version 2");
        history.save(editor);
        System.out.println(editor.getContent());

        editor.setContent("Version 3");
        System.out.println(editor.getContent());

        history.undo(editor);
        System.out.println(editor.getContent());

        history.undo(editor);
        System.out.println(editor.getContent());
    }
}
Declaração de lançamento Este artigo está reproduzido em: https://dev.to/diegosilva13/understanding-the-memento-design-pattern-in-java-2c72?1 Se houver alguma infração, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3