Samengesteld ontwerppatroon in Java

1. Inleiding

In deze korte tutorial introduceren we het samengestelde ontwerppatroon in Java.

We gaan de structuur en het doel van het gebruik ervan beschrijven.

2. De structuur

Het composietpatroon is bedoeld om individuele objecten en composities van objecten of 'composieten' op dezelfde manier te kunnen behandelen.

Het kan worden gezien als een boomstructuur die bestaat uit typen die een basistype erven, en het kan een enkel onderdeel of een hele hiërarchie van objecten vertegenwoordigen.

We kunnen het patroon opsplitsen in:

  • component - is de basisinterface voor alle objecten in de compositie. Het moet een interface of een abstracte klasse zijn met de gebruikelijke methoden om de onderliggende composieten te beheren.
  • leaf - implementeert het standaardgedrag van de basiscomponent. Het bevat geen verwijzing naar de andere objecten.
  • composiet - heeft bladelementen. Het implementeert de basiscomponentmethoden en definieert de kindgerelateerde bewerkingen.
  • client - heeft toegang tot de compositie-elementen door het basiscomponentobject te gebruiken.

3. Praktisch voorbeeld

Laten we nu eens kijken naar de implementatie. Laten we veronderstellen we willen een hiërarchische structuur van afdelingen in een bedrijf opbouwen.

3.1. De basiscomponent

Als een componentobject definiëren we een simple afdeling koppel:

openbare interface Afdeling {void printDepartmentName (); }

3.2. Bladeren

Laten we voor de bladcomponenten klassen definiëren voor financiële en verkoopafdelingen:

openbare klasse FinancialDepartment implementeert Department {private Integer id; private String naam; openbare ongeldige printDepartmentName () {System.out.println (getClass (). getSimpleName ()); } // standard constructor, getters, setters}

De tweede bladklasse, Verkoopafdeling, is soortgelijk:

public class SalesDepartment implementeert Department {private Integer id; private String naam; openbare ongeldige printDepartmentName () {System.out.println (getClass (). getSimpleName ()); } // standard constructor, getters, setters}

Beide klassen implementeren het printDepartmentName () methode uit de basiscomponent, waar ze de klassenamen voor elk ervan afdrukken.

Omdat het leaf-klassen zijn, bevatten ze geen andere afdeling voorwerpen.

Laten we vervolgens ook een samengestelde klasse bekijken.

3.3. Het samengestelde element

Laten we als samengestelde klasse een Hoofdafdeling klasse:

public class HeadDepartment implementeert Department {private Integer id; private String naam; privélijst childDepartments; openbare HeadDepartment (geheel getal id, tekenreeksnaam) {this.id = id; this.name = naam; this.childDepartments = nieuwe ArrayList (); } public void printDepartmentName () {childDepartments.forEach (Department :: printDepartmentName); } public void addDepartment (Afdeling afdeling) {childDepartments.add (afdeling); } public void removeDepartment (Afdeling afdeling) {childDepartments.remove (afdeling); }}

Dit is een samengestelde klasse omdat deze een verzameling afdeling componenten, evenals methoden voor het toevoegen en verwijderen van elementen uit de lijst.

De composiet printDepartmentName () methode wordt geïmplementeerd door de lijst met leaf-elementen te herhalen en de juiste methode voor elk ervan aan te roepen.

4. Testen

Laten we voor testdoeleinden eens kijken naar een CompositeDemo klasse:

public class CompositeDemo {public static void main (String args []) {Afdeling salesDepartment = nieuwe SalesDepartment (1, "Verkoopafdeling"); Afdeling financialDepartment = nieuwe FinancialDepartment (2, "Financiële afdeling"); HeadDepartment headDepartment = nieuwe HeadDepartment (3, "Hoofdafdeling"); headDepartment.addDepartment (salesDepartment); headDepartment.addDepartment (financiële afdeling); headDepartment.printDepartmentName (); }}

Eerst maken we twee instanties voor de financiële en verkoopafdelingen. Daarna instantiëren we de hoofdafdeling en tellen we de eerder gemaakte instanties erbij op.

Eindelijk kunnen we het printDepartmentName () samenstelling methode. Zoals we verwachten, de uitvoer bevat de klassenamen van elke leaf-component:

Verkoopafdeling Financiële afdeling

5. Conclusie

In dit artikel hebben we geleerd over het samengestelde ontwerppatroon. Het artikel benadrukt de hoofdstructuur en demonstreert het gebruik aan de hand van het praktische voorbeeld.

Zoals gewoonlijk is de volledige code beschikbaar in het Github-project.