Template Method is een gedragsontwerppatroon. Het Template Method-ontwerppatroon wordt gebruikt om een methode-prototype te maken en sommige stappen van de implementatie uit te stellen naar de subklassen.
Template Method Ontwerppatroon
De template-methode definieert de stappen om een algoritme uit te voeren en kan een standaardimplementatie bieden die gemeenschappelijk is voor alle of sommige subklassen. Laten we dit patroon begrijpen aan de hand van een voorbeeld. Stel dat we een algoritme willen bieden om een huis te bouwen. De stappen die moeten worden uitgevoerd om een huis te bouwen zijn – fundering leggen, pilaren bouwen, muren en ramen bouwen. Het belangrijke punt is dat we de uitvoeringsvolgorde niet kunnen wijzigen omdat we geen ramen kunnen bouwen voordat we de fundering hebben gelegd. Dus in dit geval kunnen we een template-methode maken die verschillende methoden zal gebruiken om het huis te bouwen. Nu is het bouwen van de fundering voor een huis hetzelfde voor alle soorten huizen, of het nu een houten huis of een glazen huis is. Dus we kunnen een basimplementatie hiervoor bieden. Als subklassen deze methode willen overschrijven, kunnen ze dat, maar meestal is het gemeenschappelijk voor alle soorten huizen. Om ervoor te zorgen dat subklassen de template-methode niet overschrijven, moeten we deze als definitief markeren.
Template Method Abstracte Klasse
Aangezien we willen dat sommige methoden worden geïmplementeerd door subklassen, moeten we onze basisklasse als een abstracte klasse maken. HouseTemplate.java
package com.journaldev.design.template;
public abstract class HouseTemplate {
//template methode, final zodat subklassen deze niet kunnen overschrijven
public final void buildHouse(){
buildFoundation();
buildPillars();
buildWalls();
buildWindows();
System.out.println("House is built.");
}
//standaardimplementatie
private void buildWindows() {
System.out.println("Building Glass Windows");
}
//methoden die door subklassen moeten worden geïmplementeerd
public abstract void buildWalls();
public abstract void buildPillars();
private void buildFoundation() {
System.out.println("Building foundation with cement,iron rods and sand");
}
}
buildHouse()
is de template methode en definieert de volgorde van uitvoering voor het uitvoeren van verschillende stappen.
Concrete klassen van het template methode-ontwerp
We kunnen verschillende soorten huizen hebben, zoals een houten huis en een glazen huis. 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");
}
}
We hadden ook andere methoden kunnen overschrijven, maar voor eenvoud doe ik dat nu niet. 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");
}
}
Klant van het template methode-ontwerppatroon
Laten we ons template methode-voorbeeld testen met een testprogramma. HousingClient.java
package com.journaldev.design.template;
public class HousingClient {
public static void main(String[] args) {
HouseTemplate houseType = new WoodenHouse();
//gebruikmakend van de template methode
houseType.buildHouse();
System.out.println("************");
houseType = new GlassHouse();
houseType.buildHouse();
}
}
Merk op dat de cliënt de template-methode van de basisklasse aanroept en afhankelijk van de implementatie van verschillende stappen, enkele methoden van de basisklasse gebruikt en sommige van de subklasse. De uitvoer van het bovenstaande programma is:
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.
Klassediagram van de template-methode
Template Method-ontwerppatroon in JDK
- Alle niet-abstracte methoden van java.io.InputStream, java.io.OutputStream, java.io.Reader en java.io.Writer.
- Alle niet-abstracte methoden van java.util.AbstractList, java.util.AbstractSet en java.util.AbstractMap.
Belangrijke punten van het Template Method-ontwerppatroon
- De template-methode moet bestaan uit bepaalde stappen waarvan de volgorde vaststaat en voor sommige van de methoden verschilt de implementatie van de basisklasse tot de subklasse. De template-methode moet final zijn.
- Meestal roepen subklassen methoden aan van de superklasse, maar in het sjabloonpatroon roept de superklasse sjabloonmethode methoden aan van de subklassen, dit staat bekend als het Hollywood-principe – “bel ons niet, wij bellen u.”
- Methoden in de basisklasse met standaardimplementatie worden aangeduid als Hooks en zijn bedoeld om te worden overschreven door subklassen. Als je wilt dat sommige methoden niet worden overschreven, kun je ze definitief maken. Bijvoorbeeld, in ons geval kunnen we de methode buildFoundation() definitief maken als we niet willen dat subklassen deze overschrijven.
Dat is alles voor het sjabloonmethode-ontwerppatroon in Java. Ik hoop dat je het leuk vond.
Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java