Menu
CoddyTech

Pola Template Method

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 94 dari 107.

Pola Template Method mendefinisikan kerangka algoritma dalam tipe dasar, sehingga subtipe dapat mengganti langkah-langkah tertentu tanpa mengubah struktur keseluruhan. Decorator menambahkan perilaku dengan membungkus object, sedangkan Template Method mengontrol alur algoritma dan memungkinkan penyesuaian setiap langkah.

Di Go, karena tidak ada pewarisan, kita menerapkan pola ini menggunakan penyematan struct yang dipadukan dengan interface. Struct "template" menentukan struktur algoritma dan memanggil method yang bisa disesuaikan:

type DataProcessor interface {
    ReadData() string
    ProcessData(data string) string
    SaveData(result string) string
}

type BaseProcessor struct {
    Impl DataProcessor
}

func (b *BaseProcessor) Execute() string {
    data := b.Impl.ReadData()
    result := b.Impl.ProcessData(data)
    return b.Impl.SaveData(result)
}

Implementasi konkret menyediakan versinya sendiri untuk setiap langkah, sementara alur algoritma tetap tidak berubah:

type CSVProcessor struct{}

func (c CSVProcessor) ReadData() string       { return "csv-data" }
func (c CSVProcessor) ProcessData(d string) string { return "processed-" + d }
func (c CSVProcessor) SaveData(r string) string    { return "Saved: " + r }

type JSONProcessor struct{}

func (j JSONProcessor) ReadData() string       { return "json-data" }
func (j JSONProcessor) ProcessData(d string) string { return "parsed-" + d }
func (j JSONProcessor) SaveData(r string) string    { return "Stored: " + r }

Method template Execute mengatur langkah-langkah dalam urutan tetap:

csvProc := &BaseProcessor{Impl: CSVProcessor{}}
fmt.Println(csvProc.Execute())  // Disimpan: processed-csv-data

jsonProc := &BaseProcessor{Impl: JSONProcessor{}}
fmt.Println(jsonProc.Execute()) // Disimpan: parsed-json-data

Template Method cocok digunakan saat kamu memiliki algoritma yang memiliki struktur sama, tetapi berbeda pada langkah-langkah tertentu, seperti pipeline impor/ekspor data, generator laporan, atau framework pengujian.

challenge icon

Tantangan

Mudah

Mari buat sistem pembuatan laporan menggunakan pola Template Method! Kamu akan membuat framework tempat berbagai jenis laporan mengikuti proses pembuatan yang sama, yaitu mengumpulkan data, memformatnya, dan menghasilkan output, tetapi setiap jenis laporan menyesuaikan langkah-langkah ini dengan cara yang berbeda.

Kamu akan menyusun kodemu dalam tiga file:

  • report.go: Definisikan interface dan pemroses dasar yang mengatur algoritma pembuatan laporan.

    Buat interface ReportGenerator dengan tiga method yang mewakili langkah-langkah pembuatan laporan:

    • GatherData() string: mengambil data mentah untuk laporan
    • FormatData(data string) string: mengubah data ke dalam format laporan
    • OutputReport(formatted string) string: menghasilkan pesan output akhir

    Buat struct ReportProcessor yang menyimpan implementasi ReportGenerator. Tambahkan method Generate() string yang menjalankan ketiga langkah secara berurutan: mengumpulkan, memformat, lalu menghasilkan output, kemudian mengembalikan hasil akhir.

  • generators.go: Implementasikan generator laporan konkret yang menyesuaikan setiap langkah.

    Buat dua jenis laporan:

    • SalesReport dengan field Region (string)
      • GatherData() mengembalikan sales-data-[region]
      • FormatData(data) mengembalikan SALES REPORT: [data]
      • OutputReport(formatted) mengembalikan Printed: [formatted]
    • InventoryReport dengan field Warehouse (string)
      • GatherData() mengembalikan inventory-[warehouse]
      • FormatData(data) mengembalikan *** [data] ***
      • OutputReport(formatted) mengembalikan Exported: [formatted]
  • main.go: Tunjukkan bagaimana struktur algoritma yang sama menghasilkan hasil berbeda berdasarkan implementasinya.

    Baca jenis laporan (sales atau inventory) dan nilai konfigurasi (region untuk sales, warehouse untuk inventory). Buat generator yang sesuai, bungkus dengan ReportProcessor, panggil Generate(), lalu cetak hasilnya.

Input berikut akan diberikan:

  • Baris 1: Jenis laporan (sales atau inventory)
  • Baris 2: Nilai konfigurasi (nama region atau nama warehouse)

Contohnya, jika diberikan:

sales
North

Output kamu seharusnya:

Printed: SALES REPORT: sales-data-North

Dan jika diberikan:

inventory
MainHub

Output kamu seharusnya:

Exported: *** inventory-MainHub ***

Dan jika diberikan:

sales
West

Output kamu seharusnya:

Printed: SALES REPORT: sales-data-West

Perhatikan bahwa ReportProcessor selalu memanggil tiga langkah yang sama dalam urutan yang sama, tetapi setiap jenis laporan menyediakan implementasinya sendiri untuk langkah-langkah tersebut. Kerangka algoritmanya tetap, sementara detailnya berbeda. Itulah pola Template Method!

Coba sendiri

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Baca jenis laporan
	scanner.Scan()
	reportType := scanner.Text()
	
	// Baca nilai konfigurasi (wilayah atau gudang)
	scanner.Scan()
	configValue := scanner.Text()

	// TODO: Buat generator yang sesuai berdasarkan reportType
	// - Jika reportType bernilai "sales", buat SalesReport dengan Region diatur ke configValue
	// - Jika reportType bernilai "inventory", buat InventoryReport dengan Warehouse diatur ke configValue
	
	// TODO: Buat ReportProcessor dengan generator tersebut
	
	// TODO: Panggil Generate() dan cetak hasilnya
	_ = reportType
	_ = configValue
	fmt.Println("TODO: Generate and print the report")
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online