Uzorak dekoratora u Javi

1. Pregled

Uzorak dekoratora može se koristiti za pridruživanje dodatnih odgovornosti objektu statički ili dinamički. Dekorator nudi poboljšano sučelje za izvorni objekt.

U provedbi ovog uzorka preferiramo sastav nad nasljeđivanjem - tako da možemo iznova smanjiti općenite troškove podklasiranja za svaki element ukrašavanja. Rekurzija povezana s ovim dizajnom može se koristiti za ukrašavanje našeg predmeta onoliko puta koliko nam je potrebno.

2. Primjer uzorka ukrasa

Pretpostavimo da imamo predmet božićnog drvca i da ga želimo ukrasiti. Dekoracija ne mijenja sam predmet; samo što uz božićno drvce dodajemo i neke ukrasne predmete kao što su vijenac, šljokice, drvo, mjehurići itd.:

Za ovaj scenarij slijedit ćemo izvorne konvencije dizajna i imenovanja Gang of Four. Prvo ćemo stvoriti Božićno drvce sučelje i njegova implementacija:

javno sučelje ChristmasTree {Niz ukrasi (); }

Implementacija ovog sučelja izgledat će ovako:

javna klasa ChristmasTreeImpl implementira ChristmasTree {@Override public String decoration () {return "božićno drvce"; }}

Sad ćemo stvoriti sažetak TreeDecorator klasa za ovo drvo. Ovaj dekorator će implementirati Božićno drvce sučelje, kao i zadržati isti objekt. Provedena metoda s istog sučelja jednostavno će pozvati ukrasiti() metoda s našeg sučelja:

javna apstraktna klasa TreeDecorator provodi ChristmasTree {privatno božićno drvce; // standardni konstruktori @Override public String decoration () {return tree.decorate (); }}

Sada ćemo stvoriti neki element ukrašavanja. Ovi će ukrasitelji proširiti naš sažetak TreeDecorator klase i izmijenit će svoj ukrasiti() metoda prema našem zahtjevu:

javna klasa BubbleLights proširuje TreeDecorator {public BubbleLights (božićno drvce) {super (stablo); } javni String ukras () {povratak super.decorate () + ukrasiWithBubbleLights (); } private String decorationWithBubbleLights () {return "s Bubble Lights"; }}

U ovom slučaju vrijedi sljedeće:

@Test javna void whenDecoratorsInjectedAtRuntime_thenConfigSuccess () {ChristmasTree tree1 = novi Garland (novi ChristmasTreeImpl ()); assertEquals (tree1.decorate (), "Božićno drvce s vijencem"); Božićno drvce2 = nove mjehuriće (novi Garland (novi Garland (novi ChristmasTreeImpl ()))); assertEquals (tree2.decorate (), "Božićno drvce s vijencem s vijencem s mjehurićima"); }

Imajte na umu da je u prvom stablo1 objekt, ukrašavamo ga samo jednim Vijenac, dok drugi stablo2 predmet koji ukrašavamo jednim BubbleLights i dva Vijenci. Ovaj obrazac daje nam ovu fleksibilnost da dodamo onoliko dekoratera koliko želimo za vrijeme izvođenja.

4. Zaključak

U ovom smo članku pogledali uzorak dizajna dekoratera. Ovo je dobar izbor u sljedećim slučajevima:

  • Kada želimo dodati, poboljšati ili čak ukloniti ponašanje ili stanje objekata
  • Kad samo želimo izmijeniti funkcionalnost pojedinog predmeta klase i ostale ostaviti nepromijenjenima

Potpuni izvorni kod za ovaj primjer dostupan je na GitHubu.