DEV Community

Juarez Júnior for Develop4Us

Posted on • Edited on

C# Design Pattern: Memento (Portugues)

O padrão Memento é usado para capturar e armazenar o estado interno de um objeto, de forma que ele possa ser restaurado mais tarde sem violar o princípio de encapsulamento. É útil em situações onde você deseja implementar a funcionalidade de "desfazer" ou "restaurar" em um sistema, como em editores de texto que permitem desfazer alterações.

Exemplo de Código em C#:

// Classe Memento que armazena o estado
public class Memento
{
    public string Estado { get; private set; }

    public Memento(string estado)
    {
        Estado = estado;
    }
}

// Classe Originator que usa o Memento para salvar e restaurar seu estado
public class Originator
{
    public string Estado { get; set; }

    public Memento SalvarEstado()
    {
        return new Memento(Estado);
    }

    public void RestaurarEstado(Memento memento)
    {
        Estado = memento.Estado;
    }
}

// Classe Caretaker que gerencia o histórico dos estados
public class Caretaker
{
    private Stack<Memento> _historico = new Stack<Memento>();

    public void Salvar(Originator originator)
    {
        _historico.Push(originator.SalvarEstado());
    }

    public void Desfazer(Originator originator)
    {
        if (_historico.Count > 0)
        {
            originator.RestaurarEstado(_historico.Pop());
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        // Definir o estado e salvar
        originator.Estado = "Estado 1";
        caretaker.Salvar(originator);

        // Alterar o estado e salvar
        originator.Estado = "Estado 2";
        caretaker.Salvar(originator);

        // Alterar o estado novamente
        originator.Estado = "Estado 3";
        Console.WriteLine($"Estado atual: {originator.Estado}");

        // Desfazer para o estado anterior
        caretaker.Desfazer(originator);
        Console.WriteLine($"Após desfazer: {originator.Estado}");

        // Desfazer novamente
        caretaker.Desfazer(originator);
        Console.WriteLine($"Após desfazer novamente: {originator.Estado}");
    }
}
Enter fullscreen mode Exit fullscreen mode

Explicação do Código:
Neste exemplo, a classe Originator tem um estado que pode ser salvo e restaurado. A classe Memento armazena o estado do Originator, enquanto a classe Caretaker mantém um histórico dos estados salvos e permite desfazer as alterações. No programa principal, o estado do Originator é alterado várias vezes, e as operações de desfazer restauram os estados anteriores.

Conclusão:
O padrão Memento é ideal para sistemas que precisam salvar e restaurar estados anteriores de objetos, como em editores de texto ou sistemas de versão. Ele permite implementar a funcionalidade de "desfazer" sem violar o encapsulamento dos objetos.

Código fonte: GitHub

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay