Python-Entwurfsmuster

Memento Pattern in Python

Save snapshots of an object's state and restore them later, the idea behind undo and checkpoints.

  • Profi
  • 3 Min. Lesezeit
  • 1 ausführbares Beispiel
Das lernst du
  • Originator, memento and caretaker
  • Saving and restoring snapshots
  • Keeping internals private
Editor history
  1. "final"current text
  2. Snapshot("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

  1. The editor (originator) creates a memento holding its state.
  2. A history list (caretaker) stores mementos without reading them.
  3. 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

Code ausführen →
main.py
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)
Run-Button für dieses Beispiel erstellen

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.

  1. Ersetze die Beispieldomäne, ohne die Struktur des Patterns zu verändern.
  2. Vergleiche das Pattern mit einer einfacheren Implementierung und erläutere die Abwägungen.
  3. Schreibe Tests für jeden Beteiligten, bevor du eine weitere Implementierung hinzufügst.
Im Python-Compiler ausführen →