Návrhový vzor Memento v Jave

1. Prehľad

V tomto tutoriále sa dozvieme, čo je návrhový vzor Memento a ako ho používať.

Najskôr si prejdeme trochu teórie. Potom si vytvoríme príklad, kde ilustrujeme použitie vzoru.

2. Čo je návrhový vzor mementa?

Návrhový vzor Memento, ktorý vo svojej knihe popísal Gang štyroch, je návrhovým vzorom správania. Návrhový vzor Memento ponúka riešenie na implementáciu nevratných akcií. Môžeme to urobiť uložením stavu objektu v danom okamihu a jeho obnovením, ak je potrebné vrátiť späť vykonané akcie.

Prakticky sa objekt, ktorého stav je potrebné uložiť, nazýva Originator. Domovník je objekt spúšťajúci ukladanie a obnovovanie stavu, ktorý sa nazýva Memento.

Objekt Memento by mal domovníkovi vystavovať čo najmenej informácií. To má zabezpečiť, aby sme nevystavili vnútorný stav Pôvodcu vonkajšiemu svetu, pretože by to porušilo princípy zapuzdrenia. Originátor by však mal mať prístup k dostatočnému množstvu informácií, aby sa mohol vrátiť do pôvodného stavu.

Pozrime sa na rýchly diagram tried, ktorý ilustruje vzájomné pôsobenie rôznych objektov:

Ako vidíme, Originator môže vyrábať a konzumovať Memento. Medzitým si správca udržiava štát iba pred jeho obnovením. Interná reprezentácia Pôvodcu je pred vonkajším svetom skrytá.

Tu sme však použili jediné pole na vyjadrenie stavu Pôvodcu neobmedzujeme sa iba na jedno pole a mohli sme použiť toľko polí, koľko je potrebné. Stav, ktorý sa nachádza v objekte Memento, navyše nemusí zodpovedať úplnému stavu pôvodcu. Pokiaľ sú uchované informácie dostatočné na obnovenie stavu Pôvodcu, môžeme pokračovať.

3. Kedy použiť návrhový vzor Memento?

Návrhový vzor Memento sa zvyčajne použije v situáciách, keď sú niektoré akcie nevratné, a preto je potrebné vrátiť ich pôvodný stav. Ak je však stav aplikácie Originator ťažký, použitie návrhového vzoru Memento môže viesť k nákladnému procesu vytvárania a zvýšenému využívaniu pamäte.

4. Príklad vzoru mementa

4.1. Počiatočná vzorka

Pozrime sa teraz na príklad návrhového vzoru Memento. Poďme si predstaviť, že máme textový editor:

verejná trieda TextEditor {private TextWindow textWindow; public TextEditor (TextWindow textWindow) {this.textWindow = textWindow; }}

Má textové okno, ktoré obsahuje aktuálne zadaný text, a poskytuje spôsob, ako pridať ďalší text:

verejná trieda TextWindow {private StringBuilder currentText; public TextWindow () {this.currentText = nový StringBuilder (); } public void addText (text reťazca) {currentText.append (text); }}

4.2. Memento

Teraz si predstavme, že chceme, aby náš textový editor implementoval niektoré funkcie ukladania a vrátenia. Pri ukladaní chceme, aby sa uložil náš aktuálny text. Keď teda vrátime späť ďalšie zmeny, náš uložený text bude obnovený.

Aby sme to dosiahli, použijeme návrhový vzor Memento. Najskôr vytvoríme objekt obsahujúci aktuálny text okna:

public class TextWindowState {private String text; public TextWindowState (reťazcový text) {this.text = text; } public String getText () {návratový text; }}

Tento objekt je naším Mementom. Ako vidíme, rozhodli sme sa použiť String namiesto StringBuilder zabrániť akejkoľvek aktualizácii aktuálneho textu zo strany osôb zvonku.

4.3. Pôvodca

Potom budeme musieť poskytnúť Textové okno triedy s metódami na vytvorenie a konzumáciu objektu Memento, čím sa vytvorí Textové okno náš pôvodca:

public TextWindowState save () {return new TextWindowState (wholeText.toString ()); } public void restore (TextWindowState save) {currentText = nový StringBuilder (save.getText ()); }

The uložiť () metóda nám umožňuje vytvoriť objekt, zatiaľ čo obnoviť () metóda ho spotrebuje na obnovenie predchádzajúceho stavu.

4.4. Správca

Nakoniec musíme aktualizovať náš Textový editor trieda. Ako správca bude mať stav pôvodcu a v prípade potreby požiada o jeho obnovenie:

private TextWindowState savedTextWindow; public void hitSave () {savedTextWindow = textWindow.save (); } public void hitUndo () {textWindow.restore (savedTextWindow); }

4.5. Testovanie riešenia

Pozrime sa, či to funguje cez ukážkový beh. Predstavte si, že do nášho editora pridáme nejaký text, uložíme ho, potom ešte niečo pridáme a nakoniec to vrátime späť. Aby sme to dosiahli, pridáme a print () metóda na našom Textový editor že vráti a String aktuálneho textu:

TextEditor textEditor = nový TextEditor (nový TextWindow ()); textEditor.write ("Návrhový vzor mementa \ n"); textEditor.write ("Ako to implementovať v Jave? \ n"); textEditor.hitSave (); textEditor.write ("Kúpte si mlieko a vajcia pred príchodom domov \ n"); textEditor.hitUndo (); assertThat (textEditor.print ()). isEqualTo ("Návrhový vzor Memento \ nAko ho implementovať do Javy? \ n");

Ako vidíme, posledná veta nie je súčasťou aktuálneho textu, pretože Memento bolo pred pridaním uložené.

5. Záver

V tomto krátkom článku sme vysvetlili návrhový vzor Memento a na čo sa dá použiť. Prešli sme si tiež príkladom ilustrujúcim jeho použitie v jednoduchom textovom editore.

Celý kód použitý v tomto článku nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found