Dekoratørmønsteret i Java

1. Oversigt

Et dekoratormønster kan bruges til at knytte yderligere ansvar til et objekt enten statisk eller dynamisk. En dekoratør giver en forbedret grænseflade til det originale objekt.

Ved implementeringen af ​​dette mønster foretrækker vi sammensætning frem for en arv - så vi kan reducere omkostningerne ved underklassering igen og igen for hvert dekorationselement. Rekursionen involveret i dette design kan bruges til at dekorere vores objekt så mange gange, som vi har brug for.

2. Eksempel på dekoratørmønster

Antag, at vi har et juletræsobjekt, og vi vil dekorere det. Dekorationen ændrer ikke selve genstanden; det er bare, at vi ud over juletræet tilføjer nogle dekorationsgenstande som krans, glitter, træ-topper, boble lys osv .:

I dette scenarie følger vi de oprindelige Gang of Four design- og navngivningskonventioner. Først opretter vi en Juletræ interface og dets implementering:

offentlig grænseflade ChristmasTree {String decorate (); }

Implementeringen af ​​denne grænseflade vil se ud:

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

Vi opretter nu et abstrakt TreeDecorator klasse for dette træ. Denne dekoratør vil implementere Juletræ interface samt holde det samme objekt. Den implementerede metode fra den samme grænseflade kalder simpelthen dekorere () metode fra vores interface:

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

Vi opretter nu et dekorativt element. Disse dekoratører vil udvide vores abstrakt TreeDecorator klasse og vil ændre dens dekorere () metode i henhold til vores krav:

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

I dette tilfælde gælder følgende:

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

Bemærk, at i den første træ1 objekt, vi pynter kun med kun en Garland, mens den anden træ2 objekt, vi dekorerer med en BubbleLights og to Girlander. Dette mønster giver os denne fleksibilitet til at tilføje så mange dekoratører, som vi vil have i løbetid.

4. Konklusion

I denne artikel kiggede vi på dekoratørens designmønster. Dette er et godt valg i følgende tilfælde:

  • Når vi ønsker at tilføje, forbedre eller endda fjerne objekternes opførsel eller tilstand
  • Når vi bare vil ændre funktionaliteten af ​​et enkelt objekt i klassen og lade andre forblive uændrede

Den fulde kildekode til dette eksempel er tilgængelig på GitHub.