Wzorce projektowe: Memento
Memento jest wzorcem, którego wykorzystuje w sytuacji gdy musimy zamrozić stan obiektu w celu jego późniejszego wykonania. Na przykład tak działa Undo. Drugim częstym sposobem na wykorzystanie wzorca memento jest zapamiętywanie wyników zapytań bazy danych w celu ich ponownego późniejszego wykoniania. Zwłaszcza gdy wykonanie zapytań jest bardzo zasobożerne.
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.
Przypuśmy że mamy klasę (Originator), która ma pole State pole to musi być utrwalane. Tworzymy zatem drugą klasę (Memento) która również posiada pole State. W momencie gdy potrzebujemy utrwalenia wywołujemy metodę saveToMemento Originatora. Metoda ta tworzy obiekt Memento z obecną wartością pola state Originatora. następnie nowo utworzone Memento jest wysyłane do Caretakera w celu utrwalenia.
Zobaczmy:
1 public class Memento { 2 private String state; 3 4 public String getSavedState() { 5 return state; 6 } 7 8 public Memento(String stateToSave) { 9 state = stateToSave; 10 } 11 } 12
1 public class Originator { 2 private String state; 3 4 public void setState(String state) { 5 System.out.println("Originator: Setting state to: " + state); 6 this.state = state; 7 } 8 9 public Memento saveToMemento() { 10 System.out.println("Originator: Saving to Memento"); 11 return new Memento(state); 12 } 13 14 public void restoreFromMemento(Memento m) { 15 state = m.getSavedState(); 16 System.out.println("Originator: State restored from Memento: " + state); 17 } 18 } 19
1 public class Caretaker { 2 private List<Memento> savedStates = new ArrayList<Memento>(); 3 4 public void addMemento(Memento m) { 5 savedStates.add(m); 6 } 7 8 public Memento getMemento(int index) { 9 return savedStates.get(index); 10 11 } 12 } 13
1 public class MementoRunner { 2 public static void main(String[] args) { 3 Caretaker caretaker = new Caretaker(); 4 5 Originator originator = new Originator(); 6 7 originator.setState("State 1"); 8 9 originator.setState("State 2"); 10 caretaker.addMemento(originator.saveToMemento()); 11 originator.setState("State 3"); 12 caretaker.addMemento(originator.saveToMemento()); 13 originator.setState("State 4"); 14 originator.restoreFromMemento(caretaker.getMemento(1)); 15 16 17 } 18 } 19
Diagram wzorca:

