Implementering af skabelonmetodemønsteret i Java

1. Oversigt

I denne hurtige vejledning ser vi, hvordan man udnytter skabelonmetodemønsteret - et af de mest populære GoF-mønstre.

Det gør det lettere at implementere komplekse algoritmer ved at indkapsle logik i en enkelt metode.

2. Implementering

For at demonstrere hvordan skabelonmetodemønsteret fungerer, lad os oprette et simpelt eksempel, der repræsenterer opbygning af en computerstation.

I betragtning af mønsterets definition, algoritmens struktur defineres i en baseklasse, der definerer skabelonen bygge () metode:

offentlig abstrakt klasse ComputerBuilder {// ... offentlig endelig Computer buildComputer () {addMotherboard (); setupMotherboard (); addProcessor (); returnere ny Computer (computerParts); } offentlig abstrakt ugyldig addMotherboard (); offentlig abstrakt ugyldig opsætningMotherboard (); offentlig abstrakt ugyldig addProcessor (); // ...}

Det ComputerBuilder klasse er ansvarlig for at skitsere de nødvendige trin til at opbygge en computer ved at erklære metoder til tilføjelse og opsætning af forskellige komponenter, såsom et bundkort og en processor.

Her, det bygge () metode er skabelonmetoden, som definerer trin i algoritmen til samling af computerens dele og returnerer fuldt initialiseret Computer tilfælde.

Bemærk, at jegdet er erklæret som endelig for at forhindre, at det tilsidesættes.

3. I aktion

Med basisklassen allerede indstillet, lad os prøve at bruge den ved at oprette to underklasser. Den ene, der bygger en "standard" computer, og den anden, der bygger en "high-end" computer:

offentlig klasse StandardComputerBuilder udvider ComputerBuilder {@ Override public void addMotherboard () {computerParts.put ("Motherboard", "Standard Motherboard"); } @ Override public void setupMotherboard () {motherboardSetupStatus.add ("Skrue standard bundkort til sagen."); motherboardSetupStatus.add ("Tilslutning af strømforsyningsstikkene."); bundkortSetupStatus.forEach (trin -> System.out.println (trin)); } @ Overstyr offentlig ugyldig addProcessor () {computerParts.put ("Processor", "Standardprocessor"); }}

Og her er den HighEndComputerBuilder variant:

offentlig klasse HighEndComputerBuilder udvider ComputerBuilder {@ Override public void addMotherboard () {computerParts.put ("Motherboard", "High-end Motherboard"); } @ Override public void setupMotherboard () {motherboardSetupStatus.add ("Skru high-end bundkortet til sagen."); motherboardSetupStatus.add ("Tilslutning af strømforsyningsstikkene."); bundkortSetupStatus.forEach (trin -> System.out.println (trin)); } @ Overstyr offentlig ugyldig addProcessor () {computerParts.put ("Processor", "High-end processor"); }}

Som vi kan se, behøvede vi ikke at bekymre os om hele samleprocessen, men kun for at levere implementeringer til separate metoder.

Lad os nu se det i aktion:

ny StandardComputerBuilder () .buildComputer (); .getComputerParts () .forEach ((k, v) -> System.out.println ("Del:" + k + "Værdi:" + v)); ny HighEndComputerBuilder () .buildComputer (); .getComputerParts () .forEach ((k, v) -> System.out.println ("Del:" + k + "Værdi:" + v));

4. Skabelonmetoder i Java Core Libraries

Dette mønster bruges i vid udstrækning i Java-kernebibliotekerne, for eksempel af java.util.AbstractList eller java.util.AbstractSet.

For eksempel, Abstrakt liste giver en skeletimplementering af Liste interface.

Et eksempel på en skabelonmetode kan være tilføjAlle () metode, selvom den ikke udtrykkeligt er defineret som endelig:

public boolean addAll (int index, Collection c) {rangeCheckForAdd (index); boolsk modificeret = falsk; for (E e: c) {add (index ++, e); modificeret = sand; } returneret modificeret; }

Brugere behøver kun at implementere tilføje() metode:

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

Her er det programmørens ansvar at tilvejebringe en implementering for at tilføje et element til listen i det givne indeks (variantdelen af ​​listealgoritmen).

5. Konklusion

I denne artikel viste vi skabelonmetodemønsteret og hvordan man implementerer det i Java.

Skabelonmetodemønsteret fremmer genbrug og frakobling af kode, men på bekostning af at bruge arv.

Som altid er alle kodeeksempler vist i denne artikel tilgængelige på GitHub.