Composite Design mønster i Java

1. Introduktion

I denne hurtige vejledning introducerer vi det sammensatte designmønster i Java.

Vi skal beskrive strukturen og formålet med dens anvendelse.

2. Strukturen

Det sammensatte mønster er beregnet til at tillade behandling af individuelle objekter og sammensætninger af objekter eller "kompositter" på samme måde.

Det kan ses som en træstruktur, der består af typer, der arver en basetype, og den kan repræsentere en enkelt del eller et helt objekthierarki.

Vi kan opdele mønsteret i:

  • komponent - er basisgrænsefladen til alle objekterne i kompositionen. Det skal enten være en grænseflade eller en abstrakt klasse med de almindelige metoder til at styre barnekompositterne.
  • blad - implementerer basiskomponentens standardopførsel. Den indeholder ikke en henvisning til de andre objekter.
  • komposit - har bladelementer. Det implementerer basiskomponentmetoderne og definerer de børnerelaterede operationer.
  • klient - har adgang til kompositionselementerne ved hjælp af basiskomponentobjektet.

3. Praktisk eksempel

Lad os nu dykke ned i implementeringen. Lad os antage det vi ønsker at opbygge en hierarkisk struktur for afdelinger i en virksomhed.

3.1. Basekomponenten

Som komponentobjekt definerer vi et simpelt Afdeling grænseflade:

offentlig grænsefladeafdeling {ugyldig printDepartmentName (); }

3.2. Blade

Lad bladkomponenterne definere klasser for økonomi- og salgsafdelinger:

offentlig klasse FinancialDepartment implementerer afdeling {privat heltal id; privat strengnavn; offentlig ugyldig printDepartmentName () {System.out.println (getClass (). getSimpleName ()); } // standard konstruktør, getters, setters}

Den anden bladklasse, Salgsafdeling, ligner:

offentlig klasse SalesDepartment implementerer afdeling {privat heltal id; privat strengnavn; offentlig ugyldig printDepartmentName () {System.out.println (getClass (). getSimpleName ()); } // standard konstruktør, getters, setters}

Begge klasser implementerer printDepartmentName () metode fra basiskomponenten, hvor de udskriver klassenavne for hver af dem.

Da de er bladklasser, indeholder de heller ikke andre Afdeling genstande.

Lad os derefter også se en sammensat klasse.

3.3. Det sammensatte element

Lad os som en sammensat klasse oprette en Hovedafdelingen klasse:

offentlig klasse HeadDepartment implementerer afdeling {privat heltal id; privat strengnavn; privat liste barneafdelinger; public HeadDepartment (Heltal-id, strengnavn) {this.id = id; dette.navn = navn; this.childDepartments = ny ArrayList (); } public void printDepartmentName () {childDepartments.forEach (Department :: printDepartmentName); } public void addDepartment (Department department) {childDepartments.add (department); } offentligt ugyldigt removeDepartment (Department department) {childDepartments.remove (department); }}

Dette er en sammensat klasse, da den indeholder en samling af Afdeling komponenter, samt metoder til at tilføje og fjerne elementer fra listen.

Kompositten printDepartmentName () Metoden implementeres ved at gentage listen over bladelementer og påkalde den passende metode til hver enkelt.

4. Testning

Til testformål skal vi se på en CompositeDemo klasse:

offentlig klasse CompositeDemo {public static void main (String args []) {Department salesDepartment = new SalesDepartment (1, "Sales department"); Department financialDepartment = ny FinancialDepartment (2, "Financial department"); HeadDepartment headDepartment = nyt HeadDepartment (3, "Head department"); headDepartment.addDepartment (salesDepartment); headDepartment.addDepartment (financialDepartment); headDepartment.printDepartmentName (); }}

For det første opretter vi to forekomster til økonomi- og salgsafdelingen. Derefter instantierer vi hovedafdelingen og tilføjer de tidligere oprettede forekomster til den.

Endelig kan vi teste printDepartmentName () sammensætningsmetode. Som vi forventer, output indeholder klasse navne på hver bladkomponent:

Salgsafdeling Finansiel afdeling

5. Konklusion

I denne artikel lærte vi om det sammensatte designmønster. Opskrivningen fremhæver hovedstrukturen og demonstrerer brugen gennem det praktiske eksempel.

Som sædvanlig er den komplette kode tilgængelig i Github-projektet.