Memento-Muster

Das Memento-Muster speichert einen bestimmten Zustand eines Objekts, damit das Objekt zu einem geeigneten Zeitpunkt wiederhergestellt werden kann. Das Memento-Muster ist ein Verhaltensmuster.

Das Memento-Muster ermöglicht das Erfassen und Wiederherstellen des internen Zustands eines Objekts, ohne die Kapselung zu verletzen.

Einführung

Absicht

Erfassen Sie den internen Zustand eines Objekts, ohne die Kapselung zu verletzen, und ermöglichen Sie, dass diese Zustände außerhalb des Objekts gespeichert und wiederhergestellt werden.

Wesentliche gelöste Probleme

  • Ermöglichen Sie das Erfassen und Speichern des internen Zustands eines Objekts, sodass es in Zukunft in diesen Zustand wiederhergestellt werden kann, wodurch Rückgängig- und Rollback-Operationen ermöglicht werden.

Anwendungsfall

  • Wenn die Notwendigkeit besteht, einen Rückgängig-Mechanismus bereitzustellen, der es Benutzern ermöglicht, zu vorherigen Zuständen zurückzukehren.

Implementierungsansatz

  • Memento-Klasse erstellenDient zum Speichern und Kapseln des Zustands eines Objekts.
  • Originator-Rolle erstellen: Verantwortlich für das Erstellen von Memento-Objekten und das Wiederherstellen des Zustands nach Bedarf.
  • Eine Memento-Verwaltungsklasse erstellen(Optional): Verantwortlich für die Verwaltung aller Memento-Objekte.

Schlüsselcode

  • MementoSpeichert die Zustandsinformationen des Originators.
  • Originator: Memento-Objekte erstellen und den Zustand anhand des Mementos wiederherstellen.

Anwendungsbeispiel

  • Mittel gegen ReueBietet eine Funktion für Rückgängig-Operationen.
  • Spielstand speichern: Spielfortschritt speichern und Spielern ermöglichen, frühere Speicherstände zu laden.
  • Strg+Z unter WindowsRückgängig-Operation implementieren.
  • Zurück-Schaltfläche des IE-BrowsersErmöglicht Benutzern, zu einer vorherigen Seite zurückzukehren.
  • Verwaltung von Datenbanktransaktionen: Zustand durch Transaktionsprotokolle speichern, um Rollback zu implementieren.

Vorteile

  • Mechanismus zur Zustandswiederherstellung bereitstellen: Ermöglicht Benutzern, bequem zu historischen Zuständen zurückzukehren.
  • Zustandsinformationen kapseln: Benutzer müssen sich nicht um die Details der Zustandsspeicherung kümmern.

Nachteile

  • Ressourcenverbrauch: Wenn der Zustand des Objekts komplex ist, kann das Speichern des Zustands erhebliche Ressourcen verbrauchen.

Verwendungshinweise

  • Verwenden Sie das Memento-Muster in Szenarien, in denen Datenzustände gespeichert und wiederhergestellt werden müssen.
  • Erwägen Sie, das Prototype-Muster in Kombination mit dem Memento-Muster zu verwenden, um Speicher zu sparen.

Hinweise

  • Um die Kopplung zu verringern, sollten Memento-Objekte indirekt über eine Memento-Verwaltungsklasse verwaltet werden.
  • Das Memento-Muster sollte mit Vorsicht verwendet werden, um einen übermäßigen Verbrauch von Systemressourcen zu vermeiden.

Struktur

Das Memento-Muster umfasst die folgenden Hauptrollen:

  • Memento: Verantwortlich für das Speichern des internen Zustands des Originator-Objekts. Ein Memento kann einen Teil oder die gesamte Zustandsinformation des Originators speichern.

  • Originator: Erstellt ein Memento-Objekt und verwendet es, um den eigenen internen Zustand des Objekts wiederherzustellen. Der Originator erstellt normalerweise ein Memento-Objekt, wenn der Zustand gespeichert werden muss, und verwendet das Memento-Objekt, wenn der Zustand wiederhergestellt werden muss.

  • Caretaker: Verantwortlich für das Speichern von Memento-Objekten, aber er bearbeitet oder inspiziert sie nicht. Der Caretaker kann Mementos nur an andere Objekte weitergeben.

Implementierung

Das Memento-Muster verwendet drei KlassenMemento、OriginatorundCareTaker. Memento enthält den Zustand des wiederherzustellenden Objekts. Originator erstellt den Zustand und speichert ihn in einem Memento-Objekt. Das Caretaker-Objekt ist dafür verantwortlich, den Zustand des Objekts aus dem Memento wiederherzustellen.

MementoPatternDemo, unsere Demo-Klasse verwendetCareTakerundOriginatorObjekte, um die Wiederherstellung des Objektzustands zu zeigen.

备忘录模式的 UML 图

Schritt 1

Memento-Klasse erstellen.

Memento.java

public class Memento { private String state; public Memento(String state){ this.state = state; } public String getState(){ return state; } }

Schritt 2

Originator-Klasse erstellen.

Originator.java

public class Originator { private String state; public void setState(String state){ this.state = state; } public String getState(){ return state; } public Memento saveStateToMemento(){ return new Memento(state); } public void getStateFromMemento(Memento Memento){ state = Memento.getState(); } }

Schritt 3

Erstelle die CareTaker-Klasse.

CareTaker.java

import java.util.ArrayList; import java.util.List; public class CareTaker { private List<Memento> mementoList = new ArrayList<Memento>(); public void add(Memento state){ mementoList.add(state); } public Memento get(int index){ return mementoList.get(index); } }

Schritt 4

VerwendungCareTakerundOriginatorObjekt.

MementoPatternDemo.java

public class MementoPatternDemo { public static void main(String[] args) { Originator originator = new Originator(); CareTaker careTaker = new CareTaker(); originator.setState("Zustand #1"); originator.setState("Zustand #2"); careTaker.add(originator.saveStateToMemento()); originator.setState("Zustand #3"); careTaker.add(originator.saveStateToMemento()); originator.setState("Zustand #4"); System.out.println("Aktueller Zustand: " + originator.getState()); originator.getStateFromMemento(careTaker.get(0)); System.out.println("Erster gespeicherter Zustand: " + originator.getState()); originator.getStateFromMemento(careTaker.get(1)); System.out.println("Zweiter gespeicherter Zustand: " + originator.getState()); } }

Schritt 5

Ausgabe überprüfen.

Current State: State #4
First saved State: State #2
Second saved State: State #3
Weitere Erweiterungen