Memento

Memento è un design pattern comportamentale. Si può utilizzare quando si ha la necessità di far tornare un oggetto a uno dei suoi stati precedenti; ad esempio, quando il cliente dovesse chiederci una funzione “annulla” o “torna indietro”.

Problema

Abbiamo sviluppato un gioco di successo e abbiamo una schiera di fanatici, tutti pronti ad arrivare al leggendario “livello 13”. Man mano che gli utenti salgono di livello, aumentano le probabilità di incontrare una situazione di fine-partita. I fan che trascorrono ore per arrivare a un livello avanzato sono comprensibilmente scocciati quando il loro personaggio viene fatto fuori e devono ricominciare tutto daccapo. La richiesta unanime è per un comando “salva stato”, in modo tale che i giocatori possano conservare il loro avanzamento nel gioco e, almeno, recuperare la maggior parte dei loro sforzi quando il loro personaggio è ingiustamente annientato. La funzione “salva stato” deve essere progettata per far ritornare un giocatore risuscitato all’ultimo livello completato correttamente.

Soluzione

Memento ha due obiettivi:
• salvare lo stato di un oggetto-chiave del sistema;
• mantenere l’incapsulamento dell’oggetto chiave.

Tenendo a mente il principio di singola responsabilità, è una buona idea mantenere lo stato che stiamo salvando separato dall’oggetto-chiave MasterGameObject. Quest’oggetto separato che contiene lo stato è l’oggetto GameMemento.

Va osservato che Client non ha accesso ai dati di GameMemento.

Conseguenze

Vantaggi:
• tenere lo stato salvato all’esterno dell’oggetto chiave aiuta a mantenere coerenza;
• i dati dell’oggetto chiave sono incapsulati;
• fornisce una capacità di recupero facile da implementare.

Utilizzi:
• va utilizzato per salvare lo stato di un sistema (in Java, è preferibile utilizzare Serialization).

Svantaggi:
• il salvataggio e il ripristino dello stato può richiedere del tempo.

Riferimenti

• Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides – Design Patterns. Elementi per il riuso di software a oggetti — © Pearson Education Inc. / © Pearson Paravia Bruno Mondadori, 1995-2008, pp. 285-293