In altre parole, il Memento pattern consente la creazione di un oggetto “Memento” che rappresenta lo stato di un oggetto in un determinato momento. Questo oggetto Memento viene quindi passato a un oggetto “caretaker” che lo conserva in modo sicuro fino a quando l’oggetto originale ha bisogno di ripristinare il proprio stato.
Quando viene utilizzato bene, il pattern Memento può risolvere diversi problemi correlati alla gestione degli stati degli oggetti in un’applicazione. Può essere utilizzato ad esempio per salvare lo stato di un’interfaccia utente in modo che possa essere ripristinato successivamente.
Ma come funziona il Memento pattern nella pratica?
Immaginate di avere un’App per la creazione di documenti in cui l’utente può scrivere, creare diagrammi e inserire immagini. A volte l’utente può avere la necessità di annullare le operazioni eseguite, ma non c’è un sistema integrato per farlo. In questo caso il Memento pattern può essere utilizzato per salvare lo stato del documento ogni volta che veniva effettuata un’operazione e quindi permettere di ripristinare l’ultima azione eseguita.
In questo particolare scenario, è possibile implementare il pattern Memento attraverso tre componenti importanti: l’originator, il caretaker e il memento.
L’originator (il documento) è la classe che ha lo stato da salvare. In questo caso, l’originator contiene le informazioni sul documento che stiamo creando (titolo, descrizione, testo, immagini, ecc.).
Il caretaker è la classe che gestisce il salvataggio e il ripristino dello stato del documento. Il caretaker ha un riferimento all’originator ed è responsabile del salvataggio dei memento.
Il memento rappresenta lo stato salvato del documento. Può essere implementato come un’istanza di una classe interna dell’originator.
In pratica, il flusso di lavoro del Memento pattern in questo scenario sarebbe il seguente. Ogni volta che l’utente esegue un’azione, il caretaker chiama un metodo dell’originator per salvare il suo stato (document.createMemento()) e salva il memento in una lista. Quando l’utente desidera ripristinare l’ultima azione, il caretaker richiama un altro metodo dell’originator (document.setMemento()) per ripristinare lo stato precedentemente salvato.
Utilizzando il Memento pattern, la gestione degli stati di un oggetto può essere semplificata e migliorata, fornendo una soluzione elegante per la gestione dello stato interno di un oggetto in modo da poterlo ripristinare in seguito. Questo pattern è particolarmente utile in situazioni in cui un’applicazione ha bisogno di annullare le operazioni eseguite precedentemente o di monitorare il progresso di un’operazione.
In sintesi, il Memento pattern è uno dei design pattern più utili nella progettazione di software. Quando utilizzato correttamente, può semplificare la gestione degli stati degli oggetti, migliorare l’efficienza del codice e rendere il software più affidabile e robusto. Se si sta progettando un’applicazione con molte operazioni che devono essere annullate o ripristinate, ci si dovrebbe assolutamente considerare l’uso del Memento pattern.