Implementazione del modello del metodo del modello in Java

1. Panoramica

In questo rapido tutorial, vedremo come sfruttare il pattern del metodo template, uno dei pattern GoF più popolari.

Semplifica l'implementazione di algoritmi complessi incapsulando la logica in un unico metodo.

2. Implementazione

Per dimostrare come funziona il modello del metodo modello, creiamo un semplice esempio che rappresenta la costruzione di una postazione computer.

Data la definizione del pattern, la struttura dell'algoritmo sarà definita in una classe base che definisce il metodo build () del template :

public abstract class ComputerBuilder { // ... public final Computer buildComputer() { addMotherboard(); setupMotherboard(); addProcessor(); return new Computer(computerParts); } public abstract void addMotherboard(); public abstract void setupMotherboard(); public abstract void addProcessor(); // ... }

La classe ComputerBuilder è responsabile della definizione dei passaggi necessari per creare un computer dichiarando i metodi per l'aggiunta e la configurazione di componenti diversi , come una scheda madre e un processore.

Qui, il metodo build () è il metodo modello , che definisce i passaggi dell'algoritmo per l'assemblaggio delle parti del computer e restituisce istanze del computer completamente inizializzate .

Notare che è dichiarato come finale per evitare che venga sovrascritto.

3. In azione

Con la classe base già impostata, proviamo a usarla creando due sottoclassi. Uno che crea un computer "standard" e l'altro che crea un computer "di fascia alta":

public class StandardComputerBuilder extends ComputerBuilder { @Override public void addMotherboard() { computerParts.put("Motherboard", "Standard Motherboard"); } @Override public void setupMotherboard() { motherboardSetupStatus.add( "Screwing the standard motherboard to the case."); motherboardSetupStatus.add( "Pluging in the power supply connectors."); motherboardSetupStatus.forEach( step -> System.out.println(step)); } @Override public void addProcessor() { computerParts.put("Processor", "Standard Processor"); } }

Ed ecco la variante HighEndComputerBuilder :

public class HighEndComputerBuilder extends ComputerBuilder { @Override public void addMotherboard() { computerParts.put("Motherboard", "High-end Motherboard"); } @Override public void setupMotherboard() { motherboardSetupStatus.add( "Screwing the high-end motherboard to the case."); motherboardSetupStatus.add( "Pluging in the power supply connectors."); motherboardSetupStatus.forEach( step -> System.out.println(step)); } @Override public void addProcessor() { computerParts.put("Processor", "High-end Processor"); } }

Come possiamo vedere, non dovevamo preoccuparci dell'intero processo di assemblaggio ma solo di fornire implementazioni per metodi separati.

Vediamolo ora in azione:

new StandardComputerBuilder() .buildComputer(); .getComputerParts() .forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v)); new HighEndComputerBuilder() .buildComputer(); .getComputerParts() .forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v));

4. Metodi modello nelle librerie Java Core

Questo modello è ampiamente utilizzato nelle librerie di base Java, ad esempio da java.util.AbstractList o java.util.AbstractSet.

Ad esempio, Abstract List fornisce un'implementazione scheletrica dell'interfaccia List .

Un esempio di un metodo modello può essere il metodo addAll () , sebbene non sia esplicitamente definito come finale:

public boolean addAll(int index, Collection c) { rangeCheckForAdd(index); boolean modified = false; for (E e : c) { add(index++, e); modified = true; } return modified; }

Gli utenti devono solo implementare il metodo add () :

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

In questo caso, è responsabilità del programmatore fornire un'implementazione per l'aggiunta di un elemento all'elenco in corrispondenza dell'indice dato (la parte variante dell'algoritmo di elenco).

5. conclusione

In questo articolo, abbiamo mostrato il modello del metodo del modello e come implementarlo in Java.

Il modello del metodo modello promuove il riutilizzo e il disaccoppiamento del codice, ma a scapito dell'uso dell'ereditarietà.

Come sempre, tutti gli esempi di codice mostrati in questo articolo sono disponibili su GitHub.