Padrão de lembrança C#

Resumo : neste tutorial, você aprenderá como usar o padrão C# Memento para armazenar externamente o estado interno de um objeto sem violar o encapsulamento do objeto.

Introdução ao padrão C# Memento

Às vezes, você deseja armazenar externamente o estado interno de um objeto para poder restaurá-lo mais tarde, mas não deseja violar o encapsulamento do objeto. Para fazer isso, você pode usar o padrão de design Memento.

O padrão Memento é um padrão de design comportamental que captura e externaliza o estado interno de um objeto para que o objeto possa ser restaurado posteriormente ao estado salvo, sem violar o encapsulamento.

O diagrama a seguir ilustra o padrão Memento:

Padrão de lembrança C#

O padrão Memento tem os seguintes participantes:

  • Mementoé responsável por armazenar o estado interno do Originatorobjeto. Ele pode armazenar tanto ou pouco do estado interno, dependendo das Originatornecessidades do objeto.
  • Originatoré um objeto cujo estado precisa ser salvo e restaurado. O Originatorobjeto cria um Mementoobjeto que captura um instantâneo de seu estado interno atual. O Originatorusa o Mementopara restaurar seu estado interno.
  • Caretakeré responsável pela gestão dos Mementos. O Caretakerobjeto solicita um Mementoobjeto do Originator, armazena-o e posteriormente o utiliza para restaurar o Originator.

Na prática, você achará o padrão Memento útil nos seguintes casos:

  • Desfazer/reverter: você pode usar o padrão Memento para implementar a funcionalidade de desfazer/reverter, onde você pode restaurar o estado de um objeto para um estado anterior. Isto é útil em aplicações onde os usuários fazem alterações que desejam desfazer, como em um editor de texto.
  • Controle de versão: você também pode usar o padrão Memento para implementar o controle de versão, onde você pode salvar o estado de um objeto em diferentes momentos. Isto é útil em aplicações onde é importante acompanhar as alterações feitas em um objeto ao longo do tempo, como em um sistema de gerenciamento de documentos.

Exemplo de padrão C# Memento

O programa a seguir ilustra como implementar o padrão Memento em C#:

namespace MemetoPattern;

public class Memento
{
    public string? State
    {
        get;
        set;
    }

    public Memento(string? state)
    {
        State = state;
    }
}

public class Originator
{
    public string? State
    {
        get; set;
    }
    public void RestoreState(Memento memento)
    {
        State = memento.State;
    }

    public Memento SaveState()
    {
        return new Memento(State);
    }
}

public class Caretaker
{
    public static void Main(string[] args)
    {
        var originator = new Originator
        {
            State = "State 1"
        };

        // Save the state
        var memento = originator.SaveState();

        // Change the state
        originator.State = "State 2";

        // Restore the state from the memento object
        originator.RestoreState(memento);

        // Display the state
        Console.WriteLine(originator.State); // State 1
    }
}Linguagem de código:  C#  ( cs )

Saída:

State 1Linguagem de código:  C#  ( cs )

Como funciona.

Primeiro, defina a classe Memento que captura o estado de um objeto. O estado é uma string simples que permite valor nulo:

public class Memento
{
    public string? State
    {
        get;
        set;
    }

    public Memento(string? state)
    {
        State = state;
    }
}Linguagem de código:  C#  ( cs )

Segundo, defina o objeto Originator cujo estado interno é salvo por um objeto Memento:

public class Originator
{
    public string? State
    {
        get; set;
    }
    public void RestoreState(Memento memento)
    {
        State = memento.State;
    }

    public Memento SaveState()
    {
        return new Memento(State);
    }
}Linguagem de código:  C#  ( cs )

A classe Originator possui uma propriedade State como uma string e os métodos SaveState()e RestoreState().

O SaveState()método retorna um novo objeto Memento com o estado atual. E RestoreStaterestaura o Estado de um objeto Memento atribuindo a propriedade State ao Estado do objeto Memento.

Terceiro, defina a classe Caretaker que cria um objeto Originador com o Estado 1, salva seu estado em um objeto Memento, altera o estado do objeto Originador para “Estado 2” e restaura o estado do objeto Originador para “Estado 1” usando o objeto Memento:

public class Caretaker
{
    public static void Main(string[] args)
    {
        var originator = new Originator
        {
            State = "State 1"
        };

        // Save the state
        var memento = originator.SaveState();

        // Change the state
        originator.State = "State 2";

        // Restore the state from the memento object
        originator.RestoreState(memento);

        // Display the state
        Console.WriteLine(originator.State); // State 1
    }
}Linguagem de código:  C#  ( cs )

É possível salvar vários estados do objeto originador e restaurá-lo posteriormente para um estado específico. Por exemplo:

public class Caretaker
{
    public static void Main(string[] args)
    {
        // 
        var savedStates = new List<Memento>();

        var originator = new Originator
        {
            State = "State 1"
        };

        // Save the State 1
        savedStates.Add(originator.SaveState());

        // Change the state
        originator.State = "State 2";

        // Save the State 2
        savedStates.Add(originator.SaveState());

        originator.State = "State 3";

        // Restore the intial state
        originator.RestoreState(savedStates[0]);

        Console.WriteLine(originator.State); // State 1

    }
}Linguagem de código:  C#  ( cs )

Saída:

State 1Linguagem de código:  C#  ( cs )

Resumo

  • Use o padrão Memento para armazenar externamente o estado interno de um objeto sem violar o encapsulamento.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *