Wzorce projektowe: memento

Memento jest wzorcem, którego wykorzystuje w sytuacji gdy musimy zamrozić stan obiektu w celu jego późniejszego wykonania.

Wzorzec memento składa się z trzech głównych obiektów:

  • Originator: klasa, której stan ma być przechowywany, musimy w niej implementować metody zapisujące i odczytujące stan z obiektu Memento
  • Memento: klasa, w która potrafi przechować wszystkie dane z Originatora, które muszą być utrwalone.
  • Caretaker: jest klasą która przechowuje kolekcję memento i udostępnia metody do zapisu i odczytu.

Szczególną rolę we wzorcu odgrywają dwie klasy: Originator, który jest twórcą i właścicielem wszystkich migawek stanu, oraz Memento, której obiekty przechowują stan Originatora. Obiekt Originator musi posiadać możliwość utworzenia obiektu Memento oraz odczytania jego zawartości w celu przywrócenia na tej podstawie poprzedniego stanu. Memento przechowuje stan obiektu Originator zapisany w dowolnym momencie; pozwala też na dostęp do niego obiektowi Originator, natomiast uniemożliwia operacje na migawce wszelkim innym obiektom. Przykładem jest obiekt Caretaker, który zarządza utworzonymi migawkami, natomiast nie ma dostępu do ich zawartości.

Caretaker

package pl.roboczenotatki.designpatterns.memento;

import java.util.ArrayList;
import java.util.List;

public class Caretaker {
	private List mementos;

	public List getMementos() {
		if(mementos == null){
			mementos = new ArrayList();
		}
		return mementos;
	}

	public void addMemento(Memento memento){
		getMementos().add(memento);
	}

	public Memento getMemento(int index){
		return getMementos().get(index);
	}

}

Memento

package pl.roboczenotatki.designpatterns.memento;

public class Memento {
	private final String state;

	public Memento(String state) {
		super();
		this.state = state;
	}

	public String getState() {
		return state;
	}

}

Originator

package pl.roboczenotatki.designpatterns.memento;

public class Originator {
	private String state;

	public Originator(String state) {
		super();
		this.state = state;
	}

	public void setState(String state) {
		this.state = state;
	}

	public String getState() {
		return state;
	}

	public Memento createMemento(){
		return new Memento(this.state);
	}

	public void restoreMemento(Memento memento){
		this.state = memento.getState();
	}

}

App

package pl.roboczenotatki.designpatterns.memento;

public class App
{
    public static void main( String[] args )
    {
    	System.out.println( "Design pattern: Memento" );

    	Caretaker caretaker = new Caretaker();
    	Originator originator = new Originator("nazwa1");

    	originator.setState("nazwa2");
    	caretaker.addMemento(originator.createMemento());
    	originator.setState("nazwa3");
    	caretaker.addMemento(originator.createMemento());
    	originator.setState("nazwa4");
    	originator.setState("nazwa5");
    	caretaker.addMemento(originator.createMemento());

    	System.out.println("Memementos:");
    	for (Memento m : caretaker.getMementos()) {
			System.out.println(m.getState());
		}

    	originator.restoreMemento(caretaker.getMemento(1));
    	System.out.println("Restore index 1: " + originator.getState());
    }
}

Diagram wzorca:
memento

Wzorce projektowe

Katalog wzorców projektowych Gang of Four (Gamma,Johnson, Helm, Vlissides) obejmuje 23 wzorce:

– kreacyjne: Abstract Factory, Builder, Factory Method, Prototype, Singleton
– strukturalne: Adapter, Bridge, Composite, Decorator,Composite, Facade, Proxy, Flyweight
– behawioralne: Chain of Responsibility, Command,Interpreter, Mediator, Iterator, Memento, Observer,