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.