Wzorce projektowe: Pamiątka(Memento)

Zaczynamy dzisiaj kolejny wzorzec projektowy, nazywa się Pamiątka(Memento) jest to bardzo prosty do zrozumienia wzorzec, również obrazek główny tego artykułu tłumaczy też wzorzec, przy okazji bardzo przyciąga uwagę 🙂 głównie chodzi w tym o to, żeby można było przywrócić stan obiektu do poprzedniego stanu, o wzorcu dokładniej jest dalej w artykule 🙂

 

Dyskusja

Głównym celem wzorca Pamiątka(Memento) jest zapisanie wewnętrznego stanu jakiegoś obiektu i możliwość ponownego przywrócenia tego stanu w razie potrzeby bez naruszania hermetyzacji.

Implementacja tego wzorca składa się głównie z trzech klas:

Originator– klasa zapisująca oraz przywracająca stan obiektu.

Caretaker– klasa, która przechowuje wszystkie stany obiektu na którym operuje oraz zwracająca te stany i dodająca nowe stany obiektu.

Memento– klasa przechowująca obecny stan obiektu, odczytać jej stan można przez klasę Originator.

Świetnym przykładem zastosowanie wzorca Pamiątka(Memento) jest np  przywracanie poprzednich wersji pluginów w wordpressie, jeśli korzystałeś z wordpressa i miałeś zainstalowaną wtyczkę WP Rollback to był nowy przycisk przy nazwie wtyczki Rollback, który służył do przywrócenia wtyczki do poprzedniej wersji, tak jak jest pokazane na obrazku poniżej.

Twórcy tej wtyczki na 100% korzystali z wzorca Memento 🙂 Memento jest też używany w grach, wtedy kiedy gracz chce wczytać poprzedni stan zapisanej wcześniej gry.

 

Cel

  • Zapisanie wewnętrznego stanu obiektu, w razie potrzeby przywrócenie poprzednio zapisanego stanu obiektu.
  • Nienaruszanie hermetyzacji obiektu na którym operujemy.

 

Problem

Problem w którym użyjesz wzorca memento jest bardzo prosty 🙂 chcesz np zrobić funkcję zapisywania i wczytywania stanu gry lub zrobić mechanizm przywracania twojego jakiegoś programu, który załóżmy, że teraz tworzysz do poprzedniej wersji, w takim wypadku najlepiej będzie użyć memento 🙂

Ci dojrzali wiedzą o co chodzi na powyższym obrazku 😂😂

 

Użyj wtedy kiedy:

  • Potrzebujesz przywrócić stanu obiektu do poprzedniego stanu.

 

Struktura

Diagram UML wzorca memento wygląda tak:

Wyjaśnienie działania tych klas jest już w dziale Dyskusja na samej górze artykułu, więc chyba nie muszę się powtarzać 🙂

Wiem, że czujesz się już bardzo mądry 🙂

Jednak czas już przejść do kodu 🙂 Do prawdziwej roboty 🙂

Zacznijmy od klasy Memento.

Jak widać ta klasa jak było tłumaczone wcześniej przechowuje i zwraca obecny stan obiektu.

Klasa Caretaker.

I klasa Originator.

Tak jak było mówione wcześniej ta klasa jak widać posiada metody odpowiedzialne za zapisanie oraz przywrócenie stanu obiektu. W metodzie save() musimy pobrać aktualny stan obiektu, więc musimy użyć klasy Memento to samo w metodzie restore().

Jeszcze raz powtarzam objaśnienie funkcji wszystkich tych klas jest w dziale Dyskusja na samej górze artykułu 🙂

Rzecz jasna jeszcze klient został, który korzysta z tych klas.

Wynik:

 

Przykład z życia wzięty

Wymiania bębenka hamulcowego

Załóżmy, że musimy wymienić bęben hamulcowy w samochodzie i to ma zrobić za nas jakiś robot.

To wymaga wiadomo podważenia auta, żeby najpierw ściągnąć koło następnie wymiania bębenka hamulcowego i powrót do poprzedniego stanu z powrotem założyć koło i normalnie postawić auto 🙂 W robota, który ma to za nas zrobić dobrze będzie wgrać oprogramowanie wykorzystujące wzorzec Memento 🙂 Dla lepszego zrozumienia jest poniższy obrazek.

I znowu do kodu 🙂 Zróbmy to w kolejności jak w poprzednim przykładzie 🙂 W sumie nie będzie trzeba kodu nawet wydaje mi się tłumaczyć bo jest praktycznie ten sam co w poprzednim przykładzie tylko nazwy są inne 🙂

Czyli zaczynamy od klasy Memento w naszym przypadku nazywa się ona Car.

Widać, że to samo co poprzednio tylko nazwa klasy inna 🙂

Klasa Caretaker.

To samo co poprzednio tylko również nazwy inne 🙂

Klasa Originator w naszym przypadku nazywa się ona Mechanic.

Logika tej klasy jest taka sama jak w poprzednim przykładzie 🙂

I klient 🙂

Wynik:

 

Powiązania z innymi wzorcami

  • Pamiątka(Memento) czasem jest używana w połączeniu z Iteratorem by kontrolować stan iteracji

 

Podsumowanie

I to wszystko na temat wzorca Pamiątka(Memento)🙂

Link do githuba ze wszystkimi przykładami: https://github.com/Slaw145/Memento

W następnym artykule, będzie mowa o wzorcu Polecenie (Command).

Standardowo, przypominam o newsletterze, którym wysyłam powiadomienia o nowych wpisach oraz dodatkowe informacje na temat, ogółem mówiąc, świecie IT.

KONIECZNIE dołącz do społeczności DevmanCommunity na fb, części społeczności jest w jednym miejscu 🙂

-strona na fb: Devman.pl-Sławomir Kowalski

-grupa na fb: DevmanCommunity

Pytaj, komentuj pod spodem na końcu wpisu, podziel się nim, oceń go, rób co wolisz🙂

Ilustracje, obrazki oraz diagramy są z: https://sourcemaking.com/design_patterns/memento

 
Jeśli ten wpis ci się przydał podziel się nim ze swoimi znajomymi :)

Post a comment

Be first!

avatar
  Subscribe  
Notify about