A dekoratőr minta Java-ban

1. Áttekintés

A Decorator mintával statikusan vagy dinamikusan további felelősségeket lehet egy tárgyhoz csatolni. A Decorator továbbfejlesztett felületet biztosít az eredeti objektumhoz.

Ennek a mintának a megvalósításakor előnyben részesítjük a kompozíciót az örökség helyett, hogy minden egyes díszítőelem esetében újra és újra csökkentsük az alosztályozás általános költségeit. A kialakítással járó rekurzió felhasználható tárgyunk díszítésére, ahányszor csak szükséges.

2. Dekoratőr minta

Tegyük fel, hogy van egy karácsonyfa tárgyunk, és fel akarjuk díszíteni. A díszítés nem változtatja meg magát a tárgyat; csak a karácsonyfa mellett kiegészítünk néhány díszítőelemmel, például girlandgal, talmi talppal, fa tetejével, buborékfénnyel stb.:

Ebben a forgatókönyvben követni fogjuk az eredeti Négy csoportos tervezési és elnevezési konvenciót. Először létrehozunk egy Karácsonyfa interfész és annak megvalósítása:

nyilvános felület ChristmasTree {Húr díszít (); }

Ennek a felületnek a megvalósítása a következőképpen fog kinézni:

public class ChristmasTreeImpl implementálja a ChristmasTree {@Orride public String decor () {return "Christmas tree"; }}

Most létrehozunk egy absztraktot FaDekorátor osztály ehhez a fához. Ez a dekoratőr fogja megvalósítani a Karácsonyfa felületen, valamint ugyanazt az objektumot tartsa. Az ugyanazon a felületen megvalósított módszer egyszerűen meghívja a díszít() módszer a felületünkről:

a TreeDecorator nyilvános absztrakt osztálya megvalósítja a ChristmasTree {private ChristmasTree tree; // szokásos konstruktorok @Orride public String díszít () {return tree.decorate (); }}

Most létrehozunk néhány díszítő elemet. Ezek a díszítők kiterjesztik az absztraktunkat FaDekorátor osztály és módosítani fogja annak díszít() követelményünk szerinti módszer:

public class BubbleLights kiterjeszti a TreeDecorator {public BubbleLights (ChristmasTree tree) {super (tree); } public String díszít () {return super.decorate () + decorWithBubbleLights (); } privát String decorWithBubbleLights () {return "Buborékfénnyel"; }}

Ebben az esetben a következő igaz:

@Test public void whenDecoratorsInjectedAtRuntime_thenConfigSuccess () {ChristmasTree tree1 = new Garland (new ChristmasTreeImpl ()); assertEquals (fa1.dekorálás (), "Karácsonyfa füzérrel"); ChristmasTree tree2 = új BubbleLights (új Garland (új Garland (új ChristmasTreeImpl ()))); assertEquals (tree2.decorate (), "Karácsonyfa koszorúval és füzérrel, buborékfényekkel"); }

Vegye figyelembe, hogy az első fa1 tárgyat, csak egyetlen díszítjük Girland, míg a másik fa2 tárgy, amelyet egyikkel díszítünk BubbleLights és kettő Füzérek. Ez a minta ezt a rugalmasságot biztosítja számunkra, hogy annyi dekorátort adjunk hozzá, amennyit csak akarunk futás közben.

4. Következtetés

Ebben a cikkben megnéztük a dekoratőr mintázatát. Ez jó választás a következő esetekben:

  • Amikor hozzá akarjuk adni, fokozni vagy akár eltávolítani az objektumok viselkedését vagy állapotát
  • Amikor csak módosítani akarjuk az osztály egyetlen objektumának funkcionalitását, és másokat változatlanul hagyunk

A példa teljes forráskódja elérhető a GitHub oldalon.