Dekoratørmønsteret i Java

1. Oversikt

Et dekoratormønster kan brukes til å feste ekstra ansvar til et objekt enten statisk eller dynamisk. En dekoratør gir et forbedret grensesnitt til det opprinnelige objektet.

I implementeringen av dette mønsteret foretrekker vi komposisjon framfor en arv - slik at vi kan redusere overhead av underklassering igjen og igjen for hvert dekorasjonselement. Rekursjonen som er involvert i dette designet kan brukes til å dekorere objektet vårt så mange ganger vi trenger.

2. Dekorasjonsmønstereksempel

Anta at vi har et juletreobjekt og vi vil dekorere det. Dekorasjonen endrer ikke selve gjenstanden; det er bare det at i tillegg til juletreet, legger vi til noen dekorasjonsartikler som krans, tinsel, tre-topp, boble lys osv .:

For dette scenariet følger vi de opprinnelige Gang of Four design- og navngivningskonvensjonene. Først oppretter vi en Juletre grensesnitt og implementering:

offentlig grensesnitt ChristmasTree {String decorate (); }

Implementeringen av dette grensesnittet vil se ut som:

public class ChristmasTreeImpl implementerer ChristmasTree {@Override public String decorate () {return "Christmas tree"; }}

Vi lager nå et abstrakt TreeDecorator klasse for dette treet. Denne dekoratøren vil implementere Juletre grensesnitt samt holde det samme objektet. Den implementerte metoden fra samme grensesnitt vil bare kalle dekorere() metode fra grensesnittet vårt:

offentlig abstrakt klasse TreeDecorator implementerer ChristmasTree {private ChristmasTree tree; // standardkonstruktører @ Override public String decorate () {return tree.decorate (); }}

Vi lager nå noe dekorasjonselement. Disse dekoratørene vil utvide vårt abstrakt TreeDecorator klasse og vil endre sin dekorere() metode i henhold til vårt krav:

offentlig klasse BubbleLights utvider TreeDecorator {public BubbleLights (ChristmasTree tree) {super (tree); } public String decorate () {return super.decorate () + decorateWithBubbleLights (); } private String decorateWithBubbleLights () {return "med Bubble Lights"; }}

For dette tilfellet gjelder følgende:

@Test offentlig ugyldig nårDecoratorsInjectedAtRuntime_thenConfigSuccess () {ChristmasTree tree1 = new Garland (new ChristmasTreeImpl ()); assertEquals (tree1.decorate (), "Juletre med krans"); ChristmasTree tree2 = nye BubbleLights (nye Garland (nye Garland (nye ChristmasTreeImpl ()))); assertEquals (tree2.decorate (), "Juletre med krans med krans med boblelys"); }

Merk at i den første tre1 objekt, vi pynter bare med bare en Krans, mens den andre tre2 objekt vi pynter med en BubbleLights og to Girlander. Dette mønsteret gir oss denne fleksibiliteten til å legge til så mange dekoratører som vi vil under kjøreturen.

4. Konklusjon

I denne artikkelen så vi på dekoratørens mønster. Dette er et godt valg i følgende tilfeller:

  • Når vi ønsker å legge til, forbedre eller til og med fjerne oppførselen eller tilstanden til objekter
  • Når vi bare vil endre funksjonaliteten til et enkelt objekt i klassen og la andre være uendret

Hele kildekoden for dette eksemplet er tilgjengelig på GitHub.


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