Template Method adalah sebuah tipe design pattern dimana terdapat sebuah baseclass yang akan mendefinisikan kerangka algoritma/urutan method yang nantinya akan digunakan oleh subclass-subclassnya. Base class ini akan dijadikan sebagai template untuk subclassnya, dan subclass tersebut bisa me-redefine method method yang ada di baseclass tersebut sesuai dengan kegunaan subclass itu tersendirinya.
2. Gambar Diagram
Dari gambar diatas dapat dijelaskan, jadi FrameworkClass adalah class yang akan digunakan sebagai baseclass dimana ApplicationClassOne dan ApplicationClassTwo adalah subclassnya. Kemudian didalam baseclass tersebut terdapat templateMethod(), yang didalamnya terdapat urutan pemanggilan method: 1.stepOne() 2.stepTwo() 3.stepThree() . Pada gambar diatas method stepTwo() pada gambar dijadikan sebagai placeholder, dimana definisi fungsi stepTwo itu akan di redefine pada class masing masing.
3. Contoh Sedehana
Untuk menjelaskan penggunaaan template method, maka dibuat sebuah program sederhana untuk simulasi membangun sebuah bangunan.
Pertama, dibuat sebuah baseclass bernama HouseTemplate.Java
package com.journaldev.design.template;
public abstract class HouseTemplate {
//template method, final so subclasses can't override
public final void buildHouse(){
buildFoundation();
buildPillars();
buildWalls();
buildWindows();
System.out.println("House is built.");
}
//default implementation
private void buildWindows() {
System.out.println("Building Glass Windows");
}
//methods to be implemented by subclasses
public abstract void buildWalls();
public abstract void buildPillars();
private void buildFoundation() {
System.out.println("Building foundation with cement,iron rods and sand");
}
}
Dari baseclass diatas dapat dilihat bahwa buildHouse dijadikan sebagai template method yang akan memangil buildFoundation buildPilars buildWalls dan buildWindows secara berurutan. Dimana function ini diberi final agar template method tidak dapat di override pada subclassnya. Fungsi yang terdapat didalam template method harus dapat di override agar subclass dapat meredefine isinya.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");
}
}
Contoh diatas adalah subclass untuk membuat sebuah Glass House, dimana subclass ini meredefine isi dari buildWalls dan buildPillars. 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");
}
}
Contoh diatas ia membuat subclass untuk membuat WoodenHouse dimana dia mengoverride method buildWalls dan buildPillars.package com.journaldev.design.template;
public class HousingClient {
public static void main(String[] args) {
HouseTemplate houseType = new WoodenHouse();
//using template method
houseType.buildHouse();
System.out.println("************");
houseType = new GlassHouse();
houseType.buildHouse();
}
}
Nah untuk menjalankan programnya , di main dapat dibuat baru , diatas diberikan contoh pertama kali ia membuat wooden house, maka akan digunakan method2 pada class WoodenHouse (yang telah sesuai pemanggilannya dengan template method). dan glass house akan mengugnakan method2 pada GlassHouse (yang juga telah sesuai pemanggilannya dengan template method).4. Output Implementasi:
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.
5. Contoh Penggunaan:Contoh penggunaannya misalnya dalam pembuatan game yang didalamnya terdapat beberapa mini games, Misalnya, suatu game didalamnya terdapat permainan catur dan juga permainan monopoly, maka di baseclass game akan terdapat fungsi seperti inisialisasiGame, pergaintianPemain, akhirGame , printPemenang , dan di subclass catur dan subclass monopoly , fungsi2 tersebut akan di redefine kembali lagi sesuai dengan aturan bermainnya.
Penjelasan implementasi contoh menggunakan pseudocode:
abstract class Game { protected int playersCount; abstract void initializeGame(); abstract void makePlay(int player); abstract boolean endOfGame(); abstract void printWinner(); /* A template method : */ public final void playOneGame(int playersCount) { this.playersCount = playersCount; initializeGame(); int j = 0; while (!endOfGame()) { makePlay(j); j = (j + 1) % playersCount; } printWinner(); } } class Monopoly extends Game { void initializeGame() { // Initialize players // Initialize money } void makePlay(int player) { // Process one turn of player } boolean endOfGame() { // Return true if game is over // according to Monopoly rules } void printWinner() { // Display who won } /* Specific declarations for the Monopoly game. */ // ... } class Chess extends Game { void initializeGame() { // Initialize players // Put the pieces on the board } void makePlay(int player) { // Process a turn for the player } boolean endOfGame() { // Return true if in Checkmate or // Stalemate has been reached } void printWinner() { // Display the winning player } /* Specific declarations for the chess game. */ // ... }