Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Memento

Návrh Návrhové vzory GOF Vzory chování Memento

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Memento (památka) je jednoduchý návrhový vzor, který řeší uložení vnitřního stavu objektu, aniž by byl porušen princip zapouzdření. Jelikož vnitřní stav je uvnitř objektu zapouzdřen, musí uložení dat objektu provést objekt sám. K vnitřnímu stavu se lze poté vrátit. V základní verzi tohoto vzoru se nejedná o princip historie (zpět a vpřed), ale opravdu o jeden stav, který se uloží a objekt se do něj poté dokáže vrátit. Princip historie lze nicméně doimplementovat a to i inkrementálně, aby se ukládaly pouze změny oproti původním datům. Vzor nijak neřeší jak ukládání stavu implementovat, pro tyto účely můžeme použít např. serializaci.

Motivace

V našich aplikacích můžeme na některých místech vyžadovat možnost vrátit se k předchozímu stavu, např. získat data z formuláře, který uživatel vyplnil a po jehož odeslání došlo k výpadku internetového připojení. Můžeme také potřebovat zavést funkce zpět/vpřed, ty se hodí ať programujeme kalkulačku nebo např. nějaký editor. Asi vás nepřekvapí, že vzor bude oddělovat tuto funkcionalitu do samostatného objektu. To je konec konců princip, o který se většina vzorů snaží. Původní třída uchovávající stav tak zůstane nezanesená touto logikou a bude lépe udržovatelná.

Vzor

Vzor obsahuje následující třídy:

  • Originator - Třída, jejíž stav ukládáme. Umožňuje svůj stav načíst z mementa nebo jej uložit do nového mementa a vrátit.
  • Memento - Reprezentace vnitřního stavu třídy Originator. Pouze objekt držící stav bez další logiky.
  • Caretaker - Třída ukládá/načítá mementa z/do originatoru, jedná se o manažer stavů.
Návrhový vzor Memento z GOF

Příklad

Představme si, že chceme uchovávat historii výpočtů kalkulačky. Pro zjednodušení ukládejme pouze celé zadané příklady jako textové řetězce. Pro reprezentaci historie využijeme strukturu zásobník. V praxi samozřejmě můžete ukládat objekty s libovolným počtem libovolně složitých vlastností. Memento můžeme naprogramovat i generický, abychom jej mohli využívat i pro další třídy a nemuseli psát zbytečně nové třídy.

Třída Memento:

public class Memento<T>
{

        private T data;

        public Memento(T data) {
                this.data = data;
        }

        public T getData() {
                return data;
        }

}

Třída Originator (Kalkulačka):

public class Kalkulacka<T> {
        private T priklad;

        public Memento<T> uloz() {
                return new Memento(priklad);
        }

        public void nacti(Memento<T> memento) {
                priklad = memento.getData();
        }

        public void setPriklad(T priklad) {
                this.priklad = priklad;
        }

        public T getPriklad() {
                return priklad;
        }

        // Nějaké další metody kalkulačky...

}

A třída Caretaker:

public class Caretaker<T> {
        private Kalkulacka<T> kalkulacka;
        private Stack<Memento<T>> historie = new Stack<Memento<T>>();

        public Caretaker(Kalkulacka kalkulacka) {
                this.kalkulacka = kalkulacka;
        }

        public void uloz() {
                historie.push(kalkulacka.uloz());
        }

        public void zpet() {
                kalkulacka.nacti(historie.pop());
        }

}

Použití je následující:

Kalkulacka kalkulacka = new Kalkulacka();
Caretaker<String> historie = new Caretaker<>(kalkulacka);
kalkulacka.setPriklad("1 + 1");
System.out.println(kalkulacka.getPriklad());
historie.uloz();
kalkulacka.setPriklad("2 * 3");
System.out.println(kalkulacka.getPriklad());
historie.zpet();
System.out.println(kalkulacka.getPriklad());

A výstup aplikace:

Konzolová aplikace
1 + 1
2 * 3
1 + 1

Pozn.: Pokud by vás zajímalo, jak naprogramovat výpočet takového matematického výrazu, řeší to návrhový vzor Interpreter, také z GOF.


 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Miniatura
Předchozí článek
State
Miniatura
Všechny články v sekci
GOF - Vzory chování
Miniatura
Následující článek
Interpreter
Aktivity (1)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!