Memento Pattern in Python
Save snapshots of an object's state and restore them later, the idea behind undo and checkpoints.
- Originator, memento and caretaker
- Saving and restoring snapshots
- Keeping internals private
"final"current textSnapshot("draft")saved snapshotrestore() brings back "draft"
Snapshots you can roll back to
Memento ist ein Entwurfsmuster, mit dem du eine Momentaufnahme (snapshot) des Zustands eines Objekts speicherst, um ihn später wiederherzustellen, ohne die internen Details offenzulegen. Genau dieses Prinzip steckt hinter der Rückgängig-Funktion (undo) und den Speicherpunkten (checkpoints) vieler Anwendungen.
Das Wichtigste
- The editor (originator) creates a memento holding its state.
- A history list (caretaker) stores mementos without reading them.
restore(memento)puts the old state back.
Wann verwendet man das?
- Wiederkehrende Probleme des Objektdesigns mit bewährten Strukturen lösen.
- Verantwortlichkeiten entkoppeln, damit Code leichter erweiterbar und testbar ist.
- Eine gemeinsame Entwurfssprache für Architekturgespräche im Team verwenden.
Beispielcode
from dataclasses import dataclass
@dataclass(frozen=True)
class Snapshot:
# Memento: store a restorable snapshot without exposing internals.
text: str
class Editor:
def __init__(self): self.text = ""
def save(self): return Snapshot(self.text)
def restore(self, snapshot):
# Restore state without exposing representation details.
self.text = snapshot.text
editor = Editor()
editor.text = "draft"
saved = editor.save()
editor.text = "changed"
editor.restore(saved)
print(editor.text)
Ergebnis der Ausführung
draft
Erklärung des Codes
Die Methode save() von Editor erzeugt eine Momentaufnahme mit dem aktuellen Inhalt draft. Nachdem der Inhalt in changed geändert wurde, holt die Methode restore() den Inhalt aus der gespeicherten Momentaufnahme zurück, deshalb wird draft ausgegeben.
Ändere die Werte und führe das Programm im CodeUtility Python Online-Compiler aus, ohne Python lokal zu installieren.
Übungen zur Vertiefung
Ändere den Code anhand der folgenden Vorschläge. Wenn du selbst etwas änderst und das Ergebnis beobachtest, verstehst du viel mehr, als wenn du den Code nur liest.
- Ersetze die Beispieldomäne, ohne die Struktur des Patterns zu verändern.
- Vergleiche das Pattern mit einer einfacheren Implementierung und erläutere die Abwägungen.
- Schreibe Tests für jeden Beteiligten, bevor du eine weitere Implementierung hinzufügst.