1. O que é o Padrão Memento

O Padrão Memento é um padrão de design comportamental usado para salvar e restaurar o estado interno de um objeto. Ele salva o estado do objeto em um objeto memento, que pode ser usado para restaurar o objeto para um estado anterior no futuro.

2. Características e Vantagens do Padrão Memento

As características e vantagens do Padrão Memento incluem:

  • Pode salvar e restaurar o estado interno de um objeto sem violar o princípio de encapsulamento.
  • Pode gerenciar de forma flexível os estados históricos de um objeto, tornando conveniente realizar operações de desfazer e refazer.
  • Permite que o estado seja salvo externamente, evitando a exposição do estado interno do objeto.

3. Exemplos de Aplicações Práticas do Padrão Memento

O Padrão Memento possui muitos cenários de aplicação prática, alguns exemplos incluem:

  • A funcionalidade de desfazer e refazer em editores de texto, que podem usar o Padrão Memento para salvar o estado de cada operação.
  • A funcionalidade de salvar e carregar em jogos, que podem usar o Padrão Memento para salvar o progresso do jogo.
  • A funcionalidade de armazenamento de rascunho em clientes de e-mail, que podem usar o Padrão Memento para salvar o estado de e-mails em rascunho.

4. Implementação do Padrão Memento em Golang

4.1. Diagrama de Classes UML

Padrão Memento em Golang

4.2. Introdução do Exemplo

Descrição com Base no Diagrama de Classes UML

Neste exemplo, temos uma classe Originator com um estado interno chamado "state". O Originator define o estado usando o método SetState e cria um objeto memento usando o método CreateMemento. O estado interno do objeto memento é o mesmo que o do Originator. A classe Caretaker é responsável por armazenar o objeto memento e adicionar mementos usando o método AddMemento.

Etapas de Implementação

  1. Criar o objeto Memento, que possui um método GetState para salvar o estado interno do Originator.
  2. Criar o objeto Originator, que possui métodos para definir o estado e criar um memento.
  3. Criar o objeto Caretaker, que é responsável por salvar o objeto memento.
  4. Implementar os métodos para criar um memento e restaurar o estado no Originator:
    • Ao criar um objeto memento, salvar o estado do Originator no memento.
    • Ao restaurar o estado, restaurar o estado do memento para o Originator.
  5. Implementar os métodos para adicionar um memento e obter um memento no Caretaker:
    • O método de adição de memento é usado para salvar o objeto memento no Caretaker.
    • O método de obtenção de memento é usado para recuperar o objeto memento do Caretaker.

4.3.1. Criar um Objeto Memento

type Memento struct {
	state string
}

func (m *Memento) GetState() string {
	return m.state
}

4.3.2. Armazenar Estado no Memento

type Originator struct {
	state string
}

func (o *Originator) SetState(state string) {
	o.state = state
}

func (o *Originator) CreateMemento() *Memento {
	return &Memento{state: o.state}
}

4.3.3. Restaurar Estado do Memento

func (o *Originator) SetMemento(memento *Memento) {
	o.state = memento.GetState()
}

4.3.4. Usar o Padrão Memento para Operações de Desfazer

type Caretaker struct {
	mementos []*Memento
}

func (c *Caretaker) AddMemento(m *Memento) {
	c.mementos = append(c.mementos, m)
}

func (c *Caretaker) GetMemento(index int) *Memento {
	return c.mementos[index]
}

4.3.5. Usando o Padrão Memento para Operações de Refazer

func main() {
	originator := &Originator{}
	caretaker := &Caretaker{}

	originator.SetState("Estado 1")
	caretaker.AddMemento(originator.CreateMemento())

	originator.SetState("Estado 2")
	caretaker.AddMemento(originator.CreateMemento())

	originator.SetMemento(caretaker.GetMemento(0))
	fmt.Println("Estado do Originador após restauração para o estado 1:", originator.state)

	originator.SetMemento(caretaker.GetMemento(1))
	fmt.Println("Estado do Originador após restauração para o estado 2:", originator.state)
}