Pamiątka (ang. Memento) (wzorzec behawioralny) pozwala zachować stan lub stany obiektu w celu jego późniejszego przywrócenia. Obiekt nadawcy (Originator) zapisuje i odtwarza swój stan wykorzystując w tym celu dostarczony przez opiekuna obiekt pamiątki (Memento). Obiekt opiekuna (Caretraker) jest odpowiedzialny za przechowywanie stanów obiektu nadawcy jednakże nie ma on dostępu do jego danych. Dzięki temu nie narusza hermetyzacji obiektu nadawcy, a także upraszcza jego kod poprzez umożliwienie mu zachowanie jego stanu w historii.
Ograniczenia
Zapamiętanie wielu stanów dla złożonych obiektów może wymagać dużej ilości pamięci. Ponadto obiekt opiekuna powinien śledzić cykl życia obiektu nadawcy w celu usunięcia przestarzałych migawek.
Użycie
Wzorzec Pamiątka wykorzystywany jest przede wszystkim do przechowywania migawek z cyklu życia obiektu (historii) w celu póżniejszego przywrócenia jego stanu z uwzględnieniem ochrony dostępu spoza obiektu.
Implementacja
Klasa Originator reprezentuje obiekt kontekstu operacyjnego ze zdolnością do odtwarzania swojego stanu za pomocą obiektu klasy Memento, która przechowuje dane obiektu klasy Originator. Widoczność klasy Memento jest ograniczona, a modyfikacja jej struktury dozwolona tylko z poziomu klasy Originator. Caretaker przechowuje migawki stanu obiektu Originator w postaci obiektów Memento.
Poniższy listing przedstawia implementację wzorca Pamiątka dla obiektu Originator składającego się z jednego pola stanu.
Klient tworzy obiekt dla którego będzie możliwe zarządzanie jego stanem. Następnie dokonuje na nim operacji zmieniając jego stan, a także zarządza procesem przywracania obiektu do wybranego stanu.
Przykład
Aplikacja DocumentWriter umożliwia tworzenie dokumentów tekstowych, a także udostępnia użytkownikowi możliwość autozapisu edytowanego dokumentu oraz przywracanie jego stanu do wybranej migawki. Użytkownik może przywrócić stan tylko zapisanego (ręcznie lub automatycznie) dokumentu. Lista migawek opatrzona datą jej stworzenia dostępna jest w panelu bocznym użytkownika. Do realizacji tego zadania został wybrany wzorzec Pamiątka.
Użytkownik tworzy nowy pusty dokument, a następnie dokonuje jego edycji. W trakcie redagowania dokumentu użytkownik dokonuje jego zapisu ręcznie oraz automatycznie (co ustalony czas). W pewnym momencie użytkownik chce przywrócić stan dokumentu do jednego z poprzednio zapisanych migawek.
Biblioteki
Implementacje interfejsu Serializable mogą być przykładem realizacji wzorca Pamiątka. Proces przywracania danych aktywności po obrocie ekranu przy użyciu obiektu Bundle symuluje zachowanie wzorca.