Implementeren van het Template Method Pattern in Java

1. Overzicht

In deze korte tutorial zullen we zien hoe je gebruik kunt maken van het sjabloonmethodepatroon - een van de meest populaire GoF-patronen.

Het maakt het eenvoudiger om complexe algoritmen te implementeren door logica in een enkele methode samen te vatten.

2. Implementatie

Laten we, om te demonstreren hoe het patroon van de sjabloonmethode werkt, een eenvoudig voorbeeld maken van het bouwen van een computerstation.

Gezien de definitie van het patroon, de structuur van het algoritme wordt gedefinieerd in een basisklasse die de sjabloon definieert bouwen() methode:

openbare abstracte klasse ComputerBuilder {// ... openbare definitieve Computer buildComputer () {addMotherboard (); setupMotherboard (); addProcessor (); retourneer nieuwe computer (computerParts); } public abstract void addMotherboard (); openbare abstracte leegte setupMotherboard (); openbare abstracte ongeldige addProcessor (); // ...}

De ComputerBuilder class is verantwoordelijk voor het schetsen van de stappen die nodig zijn om een ​​computer te bouwen door methoden te declareren voor het toevoegen en instellen van verschillende componenten, zoals een moederbord en een processor.

Hier, de bouwen() methode is de sjabloonmethode, dat de stappen van het algoritme voor het samenstellen van de computeronderdelen definieert en volledig geïnitialiseerd terugkeert Computer gevallen.

Merk op dat ikt is verklaard als laatste om te voorkomen dat deze wordt opgeheven.

3. In actie

Nu de basisklasse al is ingesteld, proberen we deze te gebruiken door twee subklassen te maken. Een die een "standaard" computer bouwt, en de andere die een "high-end" computer bouwt:

public class StandardComputerBuilder breidt ComputerBuilder uit {@Override public void addMotherboard () {computerParts.put ("Motherboard", "Standard Motherboard"); } @Override public void setupMotherboard () {motherboardSetupStatus.add ("Het standaard moederbord aan de behuizing vastschroeven."); motherboardSetupStatus.add ("De voedingsconnectoren aansluiten."); motherboardSetupStatus.forEach (stap -> System.out.println (stap)); } @Override public void addProcessor () {computerParts.put ("Processor", "Standard Processor"); }}

En hier is de HighEndComputerBuilder variant:

openbare klasse HighEndComputerBuilder breidt ComputerBuilder {@Override public void addMotherboard () {computerParts.put ("Motherboard", "High-end Motherboard") uit; } @Override public void setupMotherboard () {motherboardSetupStatus.add ("Het high-end moederbord aan de behuizing vastschroeven."); motherboardSetupStatus.add ("De voedingsconnectoren aansluiten."); motherboardSetupStatus.forEach (stap -> System.out.println (stap)); } @Override public void addProcessor () {computerParts.put ("Processor", "High-end Processor"); }}

Zoals we kunnen zien, hoefden we ons geen zorgen te maken over het hele assemblageproces, maar alleen voor het leveren van implementaties voor afzonderlijke methoden.

Laten we het nu in actie zien:

nieuwe StandardComputerBuilder () .buildComputer (); .getComputerParts () .forEach ((k, v) -> System.out.println ("Deel:" + k + "Waarde:" + v)); nieuwe HighEndComputerBuilder () .buildComputer (); .getComputerParts () .forEach ((k, v) -> System.out.println ("Deel:" + k + "Waarde:" + v));

4. Sjabloonmethoden in Java Core Libraries

Dit patroon wordt veel gebruikt in de Java-kernbibliotheken, bijvoorbeeld door java.util.AbstractList of java.util.AbstractSet.

Bijvoorbeeld, Abstracte lijst biedt een skeletimplementatie van de Lijst koppel.

Een voorbeeld van een sjabloonmethode kan de Voeg alles toe() methode, hoewel het niet expliciet is gedefinieerd als laatste:

openbare boolean addAll (int index, verzameling c) {rangeCheckForAdd (index); boolean gewijzigd = false; voor (E e: c) {add (index ++, e); gewijzigd = waar; } terugkeer gewijzigd; }

Gebruikers hoeven alleen het toevoegen() methode:

public void add (int index, E element) {throw new UnsupportedOperationException (); }

Hier is het de verantwoordelijkheid van de programmeur om een ​​implementatie te bieden voor het toevoegen van een element aan de lijst bij de gegeven index (het variantgedeelte van het listingalgoritme).

5. Conclusie

In dit artikel hebben we het patroon van de sjabloonmethode laten zien en hoe het in Java kan worden geïmplementeerd.

Het patroon van de sjabloonmethode bevordert hergebruik en ontkoppeling van code, maar gaat ten koste van het gebruik van overerving.

Zoals altijd zijn alle codevoorbeelden die in dit artikel worden getoond, beschikbaar op GitHub.