Template Method Pattern #
Dalam pengembangan perangkat lunak, design pattern membantu developer membuat kode yang lebih bersih, dapat dipelihara, dan fleksibel. Salah satu kategori design pattern adalah Behavioral Pattern, yang fokus pada komunikasi dan tanggung jawab antar objek. Template Method Pattern adalah salah satu pola perilaku yang sering digunakan untuk mendefinisikan kerangka kerja algoritma, sementara beberapa langkah dapat diubah oleh subclass.
Apa itu Template Method Pattern? #
Template Method Pattern adalah pola yang mendefinisikan skeleton dari sebuah algoritma dalam sebuah metode, sementara beberapa langkah spesifik algoritma didelegasikan ke subclass. Dengan kata lain, algoritma tetap konsisten, tetapi subclass bisa menentukan perilaku detailnya.
Ciri utama dari Template Method Pattern:
- Ada template method: metode final yang menentukan urutan langkah-langkah algoritma.
- Ada primitive operations: langkah-langkah yang bisa diubah oleh subclass.
- Template method tidak berubah, sementara subclass bisa menyesuaikan langkah-langkah tertentu.
Tujuan dari Pattern #
Beberapa tujuan utama penggunaan Template Method Pattern:
- Mempertahankan konsistensi algoritma: Struktur umum algoritma tetap sama.
- Mendukung variasi: Beberapa langkah dapat dimodifikasi oleh subclass tanpa mengubah kerangka kerja.
- Mengurangi duplikasi kode: Langkah umum didefinisikan di superclass, langkah spesifik di subclass.
- Memfasilitasi pemeliharaan: Perubahan pada algoritma umum cukup dilakukan di superclass.
Kapan Cocok Digunakan? #
Template Method Pattern cocok digunakan ketika:
- Ada algoritma yang konstan dalam strukturnya, tetapi beberapa langkah bisa berbeda.
- Anda ingin meminimalkan duplikasi kode antara berbagai implementasi algoritma.
- Ingin memisahkan invariant behavior (yang tidak berubah) dari variant behavior (yang bisa berubah).
- Menginginkan framework atau library yang fleksibel, namun tetap konsisten dalam alur.
Contoh Implementasi (Golang) #
Berikut contoh sederhana implementasi Template Method Pattern di Golang:
package main
import "fmt"
// Abstract class / Template
type DataProcessor interface {
ReadData()
ProcessData()
WriteData()
// Template method
Execute()
}
type BaseProcessor struct {}
func (bp *BaseProcessor) Execute(dp DataProcessor) {
dp.ReadData()
dp.ProcessData()
dp.WriteData()
}
// Concrete class 1
type CSVProcessor struct {
BaseProcessor
}
func (c *CSVProcessor) ReadData() {
fmt.Println("Membaca data dari CSV")
}
func (c *CSVProcessor) ProcessData() {
fmt.Println("Memproses data CSV")
}
func (c *CSVProcessor) WriteData() {
fmt.Println("Menulis data ke CSV")
}
// Concrete class 2
type JSONProcessor struct {
BaseProcessor
}
func (j *JSONProcessor) ReadData() {
fmt.Println("Membaca data dari JSON")
}
func (j *JSONProcessor) ProcessData() {
fmt.Println("Memproses data JSON")
}
func (j *JSONProcessor) WriteData() {
fmt.Println("Menulis data ke JSON")
}
func main() {
csv := &CSVProcessor{}
json := &JSONProcessor{}
// Eksekusi template method
csv.Execute(csv)
json.Execute(json)
}
Output:
Membaca data dari CSV
Memproses data CSV
Menulis data ke CSV
Membaca data dari JSON
Memproses data JSON
Menulis data ke JSON
Best Practices #
- Gunakan interface untuk primitive operations: Pastikan langkah yang bisa diubah diimplementasikan melalui interface atau metode abstrak.
- Jangan ubah urutan template method: Template method harus final untuk menjaga konsistensi algoritma.
- Gunakan hook methods jika perlu: Hook adalah metode opsional yang bisa diimplementasikan oleh subclass jika diperlukan.
- Kombinasikan dengan pola lain jika perlu: Misalnya, gunakan Strategy untuk langkah-langkah tertentu yang fleksibel.
- Dokumentasikan urutan langkah: Agar developer lain memahami kerangka kerja algoritma.
Penutup #
- Template Method Pattern sering digunakan dalam framework (misal, framework testing atau framework data processing) karena memberikan kerangka kerja yang jelas.
- Pola ini membantu mengurangi kesalahan karena urutan algoritma tetap terjaga.
- Di Golang, meskipun tidak ada konsep class abstrak, interface dan embedding struct dapat digunakan untuk mencapai pola ini dengan idiomatik.
Template Method Pattern membantu developer menjaga keseimbangan antara konsistensi algoritma dan fleksibilitas implementasi langkah spesifik, sehingga kode lebih terstruktur dan mudah dipelihara.