1. Cos'è il Pattern Memento

Il Pattern Memento è un pattern di design comportamentale utilizzato per salvare e ripristinare lo stato interno di un oggetto. Salva lo stato dell'oggetto in un oggetto memento, che può essere utilizzato per ripristinare l'oggetto a uno stato precedente in futuro.

2. Caratteristiche e vantaggi del Pattern Memento

Le caratteristiche e i vantaggi del Pattern Memento includono:

  • Può salvare e ripristinare lo stato interno di un oggetto senza violare il principio dell'incapsulamento.
  • Può gestire in modo flessibile gli stati storici di un oggetto, rendendo comodo eseguire operazioni di annullamento e ripetizione.
  • Consente di salvare lo stato esternamente, evitando l'esposizione dello stato interno dell'oggetto.

3. Esempi di Applicazioni Pratiche del Pattern Memento

Il Pattern Memento ha molti scenari di applicazione pratici, alcuni esempi dei quali includono:

  • La funzionalità annulla e ripeti negli editor di testo, che possono utilizzare il Pattern Memento per salvare lo stato di ciascuna operazione.
  • La funzionalità di salvataggio e caricamento nei giochi, che può utilizzare il Pattern Memento per salvare il progresso del gioco.
  • La funzione di salvataggio delle bozze nei client di posta elettronica, che può utilizzare il Pattern Memento per salvare lo stato delle bozze di email.

4. Implementazione del Pattern Memento in Golang

4.1. Diagramma delle classi UML

Pattern Memento in Golang

4.2. Introduzione dell'esempio

Descrizione basata sul diagramma delle classi UML

In questo esempio, abbiamo una classe Originator con uno stato interno chiamato "state". L'Originator imposta lo stato utilizzando il metodo SetState e crea un oggetto memento utilizzando il metodo CreateMemento. Lo stato interno dell'oggetto memento è lo stesso dell'Originator. La classe Caretaker è responsabile per memorizzare l'oggetto memento e aggiungere mementi utilizzando il metodo AddMemento.

Passaggi di implementazione

  1. Creare l'oggetto Memento, che ha un metodo GetState per salvare lo stato interno dell'Originator.
  2. Creare l'oggetto Originator, che ha metodi per impostare lo stato e creare un memento.
  3. Creare l'oggetto Caretaker, che è responsabile del salvataggio dell'oggetto memento.
  4. Implementare i metodi per creare un memento e ripristinare lo stato nell'Originator:
    • Quando si crea un oggetto memento, salvare lo stato dell'Originator nel memento.
    • Quando si ripristina lo stato, ripristinare lo stato dal memento all'Originator.
  5. Implementare i metodi per aggiungere un memento e ottenere un memento nel Caretaker:
    • Il metodo di aggiunta del memento viene utilizzato per salvare l'oggetto memento nel Caretaker.
    • Il metodo di ottenimento del memento viene utilizzato per recuperare l'oggetto memento dal Caretaker.

4.3.1. Creare un oggetto Memento

type Memento struct {
	state string
}

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

4.3.2. Salvare lo stato nel 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. Ripristinare lo stato dal Memento

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

4.3.4. Utilizzo del Pattern Memento per Operazioni di Annullamento

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]
}
func main() {
    originator := &Originator{}
    caretaker := &Caretaker{}

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

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

    originator.SetMemento(caretaker.GetMemento(0))
    fmt.Println("Stato dell'originatore dopo il ripristino allo stato 1:", originator.state)

    originator.SetMemento(caretaker.GetMemento(1))
    fmt.Println("Stato dell'originatore dopo il ripristino allo stato 2:", originator.state)
}