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.[1] Es ist eines der sogenannten GoF-Muster.
Verwendung
[Bearbeiten | Quelltext bearbeiten ]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
[Bearbeiten | Quelltext bearbeiten ]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
[Bearbeiten | Quelltext bearbeiten ]- 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
[Bearbeiten | Quelltext bearbeiten ]Folgendes Javaprogramm stellt den Rückgängig-Mechanismus (undo) in Java dar.
publicclass MementoDemo{ publicstaticvoidmain(String[]args){ Originatororiginator=newOriginator(); originator.set("State1"); originator.set("State2"); Mementomemento1=originator.saveToMemento(); originator.set("State3"); // We can request multiple mementos, and choose which one to roll back to. Mementomemento2=originator.saveToMemento(); originator.set("State4"); originator.restoreFromMemento(memento2); } } publicclass Memento{ /** State of the memento */ privatefinalStringstate; publicMemento(finalStringstateToSave){ state=stateToSave; } publicStringgetSavedState(){ returnstate; } } publicclass Originator{ /** Current state */ privateStringstate; // The class could also contain additional data that is not part of the // state saved in the memento. publicvoidset(Stringstate){ System.out.println("Originator: Setting state to "+state); this.state=state; } publicMementosaveToMemento(){ System.out.println("Originator: Saving to Memento."); returnnewMemento(state); } publicvoidrestoreFromMemento(Mementomemento){ state=memento.getSavedState(); System.out.println("Originator: State after restoring from Memento: "+state); } }
Die Ausgabe lautet:
Originator: Setting state to State1 Originator: Setting state to State2 Originator: Saving to Memento. Originator: Setting state to State3 Originator: Saving to Memento. Originator: Setting state to State4 Originator: State after restoring from Memento: State3
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:
privateMemento(finalStatestate) { // Der Zustand muss zuerst geklont werden, bevor // das Memento zurückgegeben wird, oder aufeinanderfolgende // Aufrufe würden auf ein und dasselbe Objekt zugreifen. mementoState=state.clone(); }
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.
Weblinks
[Bearbeiten | Quelltext bearbeiten ]- H. Van de Sompel, M. Nelson, R. Sanderson: RFC: 7089 – HTTP Framework for Time-Based Access to Resource States -- Memento. Dezember 2013 (Mementos für die Web-Archivierung, englisch).
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten ]- ↑ Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Entwurfsmuster. 5. Auflage. Addison-Wesley, 1996, ISBN 3-8273-1862-9, S. 354.
Abstrakte Fabrik | Erbauer | Fabrikmethode | Prototyp | Singleton | Multiton | Objektpool
Adapter | Brücke | Decorator | Fassade | Fliegengewicht | Kompositum | Stellvertreter
Beobachter | Besucher | Interpreter | Iterator | Kommando | Memento | Schablonenmethode | Strategie | Vermittler | Zustand | Zuständigkeitskette | Interceptor | Nullobjekt | Protokollstapel
relationale Abbildung
Datentransferobjekt | Table Data Gateway | Row Data Gateway | Active Record | Unit of Work | Identity Map | Lazy Loading | Identity Field | Dependent Mapping | Embedded Value | Serialized LOB | Inheritance Mapper | Metadata Mapping | Query Object | Command-Query-Responsibility-Segregation
übermittlungsmuster
File Transfer | Shared Database | Remote Procedure Invocation | Messaging
Message | Command Message | Document Message | Event Message | Request-Reply | Return Address | Correlation Identifier | Message Sequence | Message Expiration | Format Indicator
Message Endpoint | Messaging Gateway | Messaging Mapper | Transactional Client | Polling Consumer | Event-driven Consumer | Competing Consumers | Message Dispatcher | Selective Consumer | Durable Subscriber | Idempotent Receiver | Service Activator
Message Channel | Point-to-Point Channel | Publisher-Subscriber Channel | Datatype Channel | Invalid Message Channel | Dead Letter Channel | Guaranteed Delivery | Channel Adapter | Messaging Bridge | Message Bus
Pipes-and-Filters | Message Router | Content-based Router | Message Filter | Dynamic Router | Recipient List | Splitter | Aggregator | Resequencer | Composed Message Processor | Scatter-Gather | Routing Slip | Process Manager | Message Broker
Message Translator | Envelope Wrapper | Content Enricher | Content Filter | Claim Check | Normalizer | Canonical Data Model
Control Bus | Detour | Wire Tap | Message History | Message Store | Smart Proxy | Test Message | Channel Purger
Application Controller | Business Delegate | Data Access Object | Dependency Injection | Extension Interface | Fluent Interface | Inversion of Control (IoC) | Lock | Model View Controller (MVC) | Model View Presenter (MVP) | Model View Update (MVU) | Model View ViewModel (MVVM) | Page Controller | Registry | Remote Facade | Repository | Service Locator | Session State | Table Module | Template View | Threadpool | Transaction Script | Transform View | Two-Step View | Value Object