Composite Design mønster i Java

1. Introduksjon

I denne raske opplæringen introduserer vi det sammensatte designmønsteret i Java.

Vi skal beskrive strukturen og formålet med bruken.

2. Strukturen

Komposittmønsteret er ment å tillate behandling av individuelle objekter og komposisjoner av objekter, eller "kompositter" på samme måte.

Det kan sees på som en trestruktur som består av typer som arver en basetype, og den kan representere en enkelt del eller et helt hierarki av objekter.

Vi kan dele mønsteret ned i:

  • komponent - er basisgrensesnittet for alle objektene i komposisjonen. Det skal enten være et grensesnitt eller en abstrakt klasse med de vanlige metodene for å administrere barnekomposittene.
  • blad - implementerer standardoppførselen til basiskomponenten. Den inneholder ikke en referanse til de andre objektene.
  • kompositt - har bladelementer. Den implementerer basiskomponentmetodene og definerer barnrelaterte operasjoner.
  • klient - har tilgang til komposisjonselementene ved å bruke grunnkomponentobjektet.

3. Praktisk eksempel

La oss nå dykke ned i implementeringen. La oss anta vi ønsker å bygge en hierarkisk struktur av avdelinger i et selskap.

3.1. Basekomponenten

Som komponentobjekt vil vi definere et enkelt Avdeling grensesnitt:

offentlig grensesnittavdeling {void printDepartmentName (); }

3.2. Løv, blader

For bladkomponentene, la oss definere klasser for økonomi- og salgsavdelinger:

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

Den andre bladklassen, Salgsavdeling, er lik:

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

Begge klassene implementerer printDepartmentName () metode fra basiskomponenten, der de skriver ut klassenavnene for hver av dem.

Ettersom de er bladklasser, inneholder de ikke andre Avdeling gjenstander.

La oss så se en sammensatt klasse også.

3.3. Det sammensatte elementet

La oss lage en som en sammensatt klasse HeadDepartment klasse:

offentlig klasse HeadDepartment implementerer avdeling {private Integer id; privat strengnavn; private Liste barneavdelinger; public HeadDepartment (Integer id, String name) {this.id = id; this.name = navn; this.childDepartments = ny ArrayList (); } public void printDepartmentName () {childDepartments.forEach (Department :: printDepartmentName); } public void addDepartment (Department department) {childDepartments.add (department); } offentlig tomrom removeDepartment (Department department) {childDepartments.remove (department); }}

Dette er en sammensatt klasse som den inneholder en samling av Avdeling komponenter, samt metoder for å legge til og fjerne elementer fra listen.

Kompositten printDepartmentName () metoden implementeres ved å gjenta listen over bladelementer og påkalle den riktige metoden for hver enkelt.

4. Testing

For testformål, la oss ta en titt på a CompositeDemo klasse:

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

Først oppretter vi to forekomster for økonomi- og salgsavdelingen. Etterpå instanserer vi hovedavdelingen og legger til de tidligere opprettede forekomster til den.

Til slutt kan vi teste printDepartmentName () sammensetningsmetode. Som vi forventer, utgangen inneholder klassenavnene til hver bladkomponent:

Salgsavdeling Finansiell avdeling

5. Konklusjon

I denne artikkelen lærte vi om det sammensatte designmønsteret. Oppskriften fremhever hovedstrukturen og demonstrerer bruken gjennom det praktiske eksemplet.

Som vanlig er den komplette koden tilgjengelig i Github-prosjektet.


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