Memento - Koll3g/DesignPatterns GitHub Wiki

Problem

Denken wir über Zustandsschnappschüsse nach. Wie genau würden Sie einen produzieren? Sie müssten wahrscheinlich alle Felder in einem Objekt durchgehen und ihre Werte in den Speicher kopieren. Dies würde jedoch nur funktionieren, wenn das Objekt ziemlich lockere Zugriffsbeschränkungen auf seine Inhalte hätte. Leider lassen die meisten realen Objekte andere nicht so leicht hineinschauen und verstecken alle wichtigen Daten in privaten Feldern.

Lösung

Um das Problem zu Lösen gibt es das Memento Pattern. Das Memento Pattern delegiert das Erstellen der Status-Snapshots an den tatsächlichen Besitzer dieses Status, das Ursprungsobjekt . Anstatt dass andere Objekte versuchen, den Zustand des Editors von „außen“ zu kopieren, kann die Editorklasse selbst den Schnappschuss erstellen, da sie vollen Zugriff auf ihren eigenen Zustand hat. Das Muster schlägt vor, die Kopie des Zustands des Objekts in einem speziellen Objekt namens memento zu speichern . Der Inhalt des Mementos ist keinem anderen Objekt zugänglich als dem, das es produziert hat. Andere Objekte müssen mit Erinnerungsstücken über eine eingeschränkte Schnittstelle kommunizieren, die es ermöglichen kann, die Metadaten des Schnappschusses (Erstellungszeit, Name der durchgeführten Operation usw.) abzurufen, aber nicht den Zustand des ursprünglichen Objekts, der im Schnappschuss enthalten ist.

UML Diagramm

Bild UML Diagramm

Vorteile

  • Sie können Momentaufnahmen des Zustands des Objekts erstellen, ohne seine Kapselung zu verletzen.

  • Sie können den Code des Urhebers vereinfachen, indem Sie es dem Verwalter überlassen, den Verlauf des Zustands des Urhebers zu verwalten.

Nachteile

  • Die App verbraucht möglicherweise viel RAM, wenn Clients zu oft Andenken erstellen.

  • Verwalter sollten den Lebenszyklus des Urhebers verfolgen, um veraltete Erinnerungsstücke vernichten zu können.

  • Die meisten dynamischen Programmiersprachen wie PHP, Python und JavaScript können nicht garantieren, dass der Status innerhalb des Mementos unberührt bleibt.