Memento (Entwurfsmuster)
# Memento (Entwurfsmuster)

Ein Memento (englisch memento pattern, auch Token) ist in der Softwareentwicklung ein Entwurfsmuster, das zur Kategorie der Verhaltensmuster (englisch behavioral patterns) gehört. Das Muster dient der Erfassung und Externalisierung des internen Zustands eines Objektes, wobei sichergestellt wird, dass dadurch seine Kapselung nicht verletzt wird. So kann das Objekt zu einem späteren Zeitpunkt wieder in diesen Zustand zurückversetzt werden. Es ist eines der sogenannten GoF-Muster.

## Verwendung

Das Memento findet Anwendung, wenn

* eine Momentaufnahme des (Teil-)Zustands eines Objektes zwischengespeichert werden muss
* verhindert werden soll, dass eine direkte Schnittstelle zur Ermittlung des Zustands Implementierungsdetails offenlegt

Ein typischer Anwendungsfall ist beispielsweise die Implementierung von Haltepunkten oder Undo-Mechanismen.

## Akteure

Das Memento-Muster hat die Akteure Originator und Memento. Der Originator ist ein Objekt mit einem internen Zustand, der verändert werden kann. Im Memento kann dieser Zustand abgespeichert werden, um zu einem späteren Zeitpunkt wiederhergestellt zu werden.

## Vorteile

* Datenkapselung kann aufrechterhalten werden, womit keine direkte Sichtbarkeit beziehungsweise Zugriffsmöglichkeit auf Attribute eines Objekts entsteht
* Das Muster stellt eine einfache Möglichkeit dar, eine teilweise Schnittstelle zu schaffen

## Beispiel

Folgendes Javaprogramm stellt den Rückgängig-Mechanismus (undo) in Java dar.

Die Ausgabe lautet:

In diesem Beispiel wird ein String als Zustand verwendet, der in Java standardmäßig unveränderbar ist. Üblicherweise ist der Zustand aber ein normales Objekt, das man klonen muss, bevor man es im Memento verwendet:

Die oben angegebene Implementierung hat einen Nachteil, indem sie eine interne Klasse deklariert. Es wäre besser, wenn die Memento-Strategie auf mehr als ein Objekt anwendbar wäre.

Grundsätzlich gibt es drei andere Wege, ein Memento zu realisieren:

* Die Serialisierung.
* Eine Klasse im selben Paket zu deklarieren.
* Auf das Objekt über einen Stellvertreter zugreifen, der die Sicherungs- und Wiederherstellungsoperation durchführt.
