Memento tervezési minta Java-ban

1. Áttekintés

Ebben az oktatóanyagban megtudhatjuk, mi a Memento Design Pattern és hogyan kell használni.

Először egy kis elméletet fogunk átélni. Ezután létrehozunk egy példát, ahol bemutatjuk a minta használatát.

2. Mi a Memento Design Pattern?

A Memento Design Pattern, amelyet a Négyek bandája ír le könyvükben, viselkedésbeli mintázat. A Memento Design Pattern megoldást kínál visszavonhatatlan műveletek végrehajtására. Ezt úgy tehetjük meg, hogy egy adott pillanatban mentjük az objektum állapotát, és helyreállítjuk, ha az azóta végrehajtott műveleteket vissza kell vonni.

Gyakorlatilag azt az objektumot, amelynek állapotát menteni kell, Originatornak nevezzük. A gondozó az állapot mentését és visszaállítását kiváltó objektum, amelyet Mementónak hívnak.

A Memento objektumnak a lehető legkevesebb információt kell kitennie a Gondnok számára. Ennek célja annak biztosítása, hogy ne tegyük ki a Kezdeményező belső állapotát a külvilág elé, mivel az megsértené a kapszulázási elveket. A Kezdeményezőnek azonban elegendő információhoz kell hozzáférnie ahhoz, hogy visszaállítsa az eredeti állapotot.

Lássunk egy gyors osztálydiagramot, amely bemutatja, hogy a különböző objektumok hogyan hatnak egymással:

Mint láthatjuk, a Kezdeményező képes előállítani és elfogyasztani egy Mementót. Eközben a gondnok csak az állam helyreállítása előtt tartja meg az államot. A Kezdő belső reprezentációját rejtve tartják a külvilág elől.

Itt azonban egyetlen mezőt használtunk a Kezdeményező állapotának ábrázolására nem korlátozódunk egy mezőre, és annyi mezőt használhatunk, amennyi szükséges. Ráadásul a Memento objektumban tartott állapotnak nem kell egyeznie a Kezdő teljes állapotával. Amíg a megőrzött információk elegendőek a Kezdeményező állapotának helyreállításához, készek vagyunk.

3. Mikor kell használni a Memento tervezési mintát?

A Memento tervezési mintát általában olyan helyzetekben használják, amikor egyes műveletek visszavonhatatlanok, ezért vissza kell állítani egy korábbi állapotra. Ha azonban az Originator állapota nehéz, a Memento Design Pattern használata drága létrehozási folyamathoz és megnövekedett memóriahasználathoz vezethet.

4. Példa a Memento mintára

4.1. Kezdeti minta

Most nézzünk meg egy példát a Memento tervezési mintára. Képzeljük el, hogy van szövegszerkesztőnk:

public class TextEditor {private TextWindow textWindow; public TextEditor (TextWindow textWindow) {this.textWindow = textWindow; }}

Van egy szöveges ablaka, amely az éppen beírt szöveget tárolja, és lehetőséget nyújt további szöveg hozzáadására:

public class TextWindow {private StringBuilder currentText; public TextWindow () {this.currentText = new StringBuilder (); } public void addText (String text) {currentText.append (text); }}

4.2. Emlékeztető

Képzeljük el, hogy azt szeretnénk, ha a szövegszerkesztőnk végrehajtana néhány mentési és visszavonási funkciót. Mentéskor azt akarjuk, hogy az aktuális szövegünk mentésre kerüljön. Így a későbbi módosítások visszavonásakor visszaállítjuk mentett szövegünket.

Ennek érdekében felhasználjuk a Memento Design Pattern-t. Először létrehozunk egy objektumot, amely az ablak aktuális szövegét tartalmazza:

public class TextWindowState {private String text; public TextWindowState (String text) {this.text = text; } public String getText () {return text; }}

Ez az objektum a mi emlékünk. Mint láthatjuk, a felhasználást választjuk Húr ahelyett StringBuilder hogy megakadályozza az aktuális szöveg kívülről történő frissítését.

4.3. Kezdeményező

Ezt követően meg kell adnunk a TextWindow osztály a Memento objektum létrehozásának és felhasználásának módszereivel, a TextWindow kezdeményezőnk:

public TextWindowState save () {return new TextWindowState (egészText.toString ()); } public void restore (TextWindowState save) {currentText = new StringBuilder (save.getText ()); }

A mentés() metódus lehetővé teszi számunkra az objektum létrehozását, míg az visszaállítás() A módszer a korábbi állapot helyreállításához használja fel.

4.4. Gondnok

Végül frissítenünk kell Szöveg szerkesztő osztály. Gondnokként megtartja a kezdeményező állapotát, és szükség esetén kéri annak visszaállítását:

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

4.5. A megoldás tesztelése

Lássuk, működik-e egy mintafuttatáson keresztül. Képzelje el, hogy hozzáadunk egy szöveget a szerkesztőhöz, elmentjük, majd adunk hozzá még egyet, végül visszavonjuk. Ennek elérése érdekében hozzáadjuk a nyomtatás() módszer a mi Szöveg szerkesztő amely visszaadja a Húr az aktuális szöveg szövege:

TextEditor textEditor = új TextEditor (új TextWindow ()); textEditor.write ("A Memento tervezési minta \ n"); textEditor.write ("Hogyan kell megvalósítani Java-ban? \ n"); textEditor.hitSave (); textEditor.write ("Vásároljon tejet és tojást, mielőtt hazaérne \ n"); textEditor.hitUndo (); assertThat (textEditor.print ()). isEqualTo ("A Memento tervezési minta \ nHogyan valósítható meg a Java-ban? \ n");

Mint láthatjuk, az utolsó mondat nem része az aktuális szövegnek, mivel a Mementót a hozzáadása előtt elmentették.

5. Következtetés

Ebben a rövid cikkben elmagyaráztuk a Memento Design Pattern-t és mire használható. Végeztünk egy példát is, amely egy egyszerű szövegszerkesztőben szemlélteti a használatát.

A cikkben használt teljes kód megtalálható a GitHub oldalon.