Template Method è un pattern di progettazione comportamentale. Il pattern di progettazione del metodo del template viene utilizzato per creare uno scheletro di metodo e delegare alcune delle fasi di implementazione alle sottoclassi.
Pattern di progettazione del metodo del template
Il metodo del template definisce le fasi per eseguire un algoritmo e può fornire un’implementazione predefinita che potrebbe essere comune a tutte o alcune delle sottoclassi. Comprendiamolo con un esempio: supponiamo di voler fornire un algoritmo per costruire una casa. Le fasi che devono essere eseguite per costruire una casa sono: costruire le fondamenta, costruire i pilastri, costruire le pareti e le finestre. Il punto importante è che non possiamo cambiare l’ordine di esecuzione perché non possiamo costruire le finestre prima di costruire le fondamenta. Pertanto, in questo caso possiamo creare un metodo del template che utilizzerà diversi metodi per costruire la casa. Ora, costruire le fondamenta per una casa è lo stesso per tutti i tipi di case, che si tratti di una casa di legno o di vetro. Quindi possiamo fornire un’implementazione di base per questo, se le sottoclassi vogliono sovrascrivere questo metodo, possono farlo, ma nella maggior parte dei casi è comune a tutti i tipi di case. Per assicurarci che le sottoclassi non sovrascrivano il metodo del template, dovremmo renderlo finale.
Classe astratta del metodo del template
Dal momento che desideriamo che alcuni dei metodi siano implementati dalle sottoclassi, dobbiamo rendere la nostra classe di base come classe astratta. HouseTemplate.java
package com.journaldev.design.template;
public abstract class HouseTemplate {
//metodo del template, final per evitare l'override nelle sottoclassi
public final void buildHouse(){
buildFoundation();
buildPillars();
buildWalls();
buildWindows();
System.out.println("House is built.");
}
//implementazione predefinita
private void buildWindows() {
System.out.println("Building Glass Windows");
}
//metodi da implementare nelle sottoclassi
public abstract void buildWalls();
public abstract void buildPillars();
private void buildFoundation() {
System.out.println("Building foundation with cement,iron rods and sand");
}
}
buildHouse()
è il metodo del template e definisce l’ordine di esecuzione per l’esecuzione di diversi passaggi.
Classi Concrete del Metodo del Template
Possiamo avere diversi tipi di case, come Casa di Legno e Casa di Vetro. WoodenHouse.java
package com.journaldev.design.template;
public class WoodenHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Wooden Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with Wood coating");
}
}
Potremmo anche sovrascrivere altri metodi, ma per semplicità non lo sto facendo. GlassHouse.java
package com.journaldev.design.template;
public class GlassHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Glass Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with glass coating");
}
}
Client del Design Pattern del Metodo del Template
Testiamo il nostro esempio del design pattern del metodo del template con un programma di test. HousingClient.java
package com.journaldev.design.template;
public class HousingClient {
public static void main(String[] args) {
HouseTemplate houseType = new WoodenHouse();
//utilizzo del metodo del template
houseType.buildHouse();
System.out.println("************");
houseType = new GlassHouse();
houseType.buildHouse();
}
}
Si noti che il client sta invocando il metodo del modello della classe base e, a seconda dell’implementazione dei diversi passaggi, sta utilizzando alcuni dei metodi della classe base e alcuni della sottoclasse. L’output del programma sopra è:
Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.
Diagramma delle classi del metodo del modello
Modello di progettazione del metodo del modello in JDK
- Tutti i metodi non astratti di java.io.InputStream, java.io.OutputStream, java.io.Reader e java.io.Writer.
- Tutti i metodi non astratti di java.util.AbstractList, java.util.AbstractSet e java.util.AbstractMap.
Punti importanti del modello di progettazione del metodo del modello
- Il metodo del modello dovrebbe consistere in determinati passaggi il cui ordine è fisso e per alcuni dei metodi, l’implementazione differisce dalla classe base alla sottoclasse. Il metodo del modello dovrebbe essere finale.
- La maggior parte delle volte, le sottoclassi chiamano i metodi dalla superclasse, ma nel pattern del template, il metodo template della superclasse chiama i metodi dalle sottoclassi, questo è conosciuto come Principio di Hollywood – “non chiamateci, saremo noi a chiamarvi”.
- I metodi nella classe base con un’implementazione predefinita vengono chiamati Hooks e sono destinati ad essere sovrascritti dalle sottoclassi. Se si desidera che alcuni dei metodi non vengano sovrascritti, è possibile renderli finali. Ad esempio, nel nostro caso, possiamo rendere il metodo buildFoundation() finale se non vogliamo che le sottoclassi lo sovrascrivano.
Questo è tutto per il pattern di progettazione del metodo template in Java, spero ti sia piaciuto.
Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java