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:
O padrão Memento tem os seguintes participantes:
Memento
é responsável por armazenar o estado interno doOriginator
objeto. Ele pode armazenar tanto ou pouco do estado interno, dependendo dasOriginator
necessidades do objeto.Originator
é um objeto cujo estado precisa ser salvo e restaurado. OOriginator
objeto cria umMemento
objeto que captura um instantâneo de seu estado interno atual. OOriginator
usa oMemento
para restaurar seu estado interno.Caretaker
é responsável pela gestão dos Mementos. OCaretaker
objeto solicita umMemento
objeto doOriginator
, armazena-o e posteriormente o utiliza para restaurar oOriginator
.
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 1
Linguagem 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 RestoreState
restaura 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 1
Linguagem de código: C# ( cs )
Resumo
- Use o padrão Memento para armazenar externamente o estado interno de um objeto sem violar o encapsulamento.