Menu
CoddyTech

Pola Template Method

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 99 dari 104.

Pola Template Method mendefinisikan kerangka algoritma dalam base class, sehingga subclass dapat mengganti langkah tertentu tanpa mengubah struktur keseluruhan algoritma. Berbeda dengan Strategy, yang mengganti seluruh algoritma, Template Method mempertahankan algoritma tetap sama sambil memungkinkan penyesuaian pada langkah-langkah individual.

Base class mengimplementasikan template method (algoritma) dan memanggil method abstrak atau virtual yang harus disediakan oleh subclass:

#include <iostream>

class DataProcessor {
public:
    // Template method: menentukan kerangka algoritma
    void process() {
        loadData();
        processData();
        saveResults();
    }
    
    virtual ~DataProcessor() = default;
    
protected:
    virtual void loadData() = 0;      // Harus diimplementasikan
    virtual void processData() = 0;   // Harus diimplementasikan
    
    // Hook: bisa ditimpa, dengan perilaku bawaan
    virtual void saveResults() {
        std::cout << "Saving to default location\n";
    }
};

class CSVProcessor : public DataProcessor {
protected:
    void loadData() override {
        std::cout << "Loading CSV file\n";
    }
    void processData() override {
        std::cout << "Parsing CSV data\n";
    }
};

class JSONProcessor : public DataProcessor {
protected:
    void loadData() override {
        std::cout << "Loading JSON file\n";
    }
    void processData() override {
        std::cout << "Parsing JSON data\n";
    }
    void saveResults() override {
        std::cout << "Saving to cloud storage\n";
    }
};

int main() {
    CSVProcessor csv;
    csv.process();  // Menggunakan saveResults bawaan
    
    JSONProcessor json;
    json.process(); // Menggunakan saveResults khusus
}

method process() adalah template method, yang menentukan urutan langkah yang tetap. Subclass mengimplementasikan loadData() dan processData() secara berbeda, tetapi urutannya tidak pernah berubah. method saveResults() adalah "hook", yang memiliki implementasi default yang dapat secara opsional ditimpa oleh subclass.

Gunakan Template Method saat kamu memiliki algoritma dengan langkah-langkah yang tetap, tetapi membutuhkan fleksibilitas dalam operasi tertentu, atau saat kamu ingin menghindari duplikasi kode di antara class yang serupa.

challenge icon

Tantangan

Mudah

Mari kita buat sistem Pembuat Laporan menggunakan pola Template Method. Kamu akan membuat framework tempat berbagai jenis laporan (seperti laporan penjualan dan laporan inventaris) mengikuti proses pembuatan yang sama, tetapi setiap jenis laporan menyesuaikan langkah tertentu. Ini adalah skenario yang tepat untuk Template Method: alur kerja keseluruhan tetap, sementara setiap langkah dapat berbeda.

Kamu akan mengatur kodemu dalam tiga file:

  • ReportGenerator.h: Definisikan class dasar abstrak dengan method template.

    Buat class ReportGenerator yang mendefinisikan kerangka algoritma pembuatan laporan. Method template generateReport() harus menjalankan langkah-langkah berikut secara berurutan:

    1. gatherData(): virtual murni, harus diimplementasikan oleh subclass
    2. formatReport(): virtual murni, harus diimplementasikan oleh subclass
    3. addHeader(): hook dengan perilaku default yang mencetak --- Report ---
    4. printReport(): virtual murni, harus diimplementasikan oleh subclass

    Method addHeader() berfungsi sebagai hook yang dapat dipilih subclass untuk di-override guna menyesuaikan header.

  • Reports.h: Implementasikan dua pembuat laporan konkret.

    Buat class SalesReport yang:

    • gatherData() mencetak Gathering sales data from database
    • formatReport() mencetak Formatting sales figures
    • printReport() mencetak Sales Total: $[amount], dengan amount diteruskan ke constructor

    Buat class InventoryReport yang:

    • gatherData() mencetak Scanning inventory records
    • formatReport() mencetak Organizing inventory by category
    • addHeader() meng-override hook untuk mencetak === Inventory Report ===
    • printReport() mencetak Items in stock: [count], dengan count diteruskan ke constructor

    Kedua class harus menerima nilai masing-masing (amount atau count) melalui constructor.

  • main.cpp: Tunjukkan pola Template Method.

    Baca dua input:

    1. Jumlah penjualan (integer)
    2. Jumlah inventaris (integer)

    Buat SalesReport dengan jumlah penjualan, lalu buat laporannya. Setelah itu, buat InventoryReport dengan jumlah inventaris, lalu buat laporannya. Cetak satu baris kosong di antara kedua laporan agar mudah dibaca.

Contohnya, dengan input 15000 dan 250:

Gathering sales data from database
Formatting sales figures
--- Report ---
Sales Total: $15000

Scanning inventory records
Organizing inventory by category
=== Inventory Report ===
Items in stock: 250

Dengan input 8500 dan 120:

Gathering sales data from database
Formatting sales figures
--- Report ---
Sales Total: $8500

Scanning inventory records
Organizing inventory by category
=== Inventory Report ===
Items in stock: 120

Perhatikan bahwa kedua laporan mengikuti urutan langkah yang sama persis seperti yang ditentukan dalam generateReport(), tetapi masing-masing mengimplementasikan langkah-langkah tersebut dengan cara berbeda. InventoryReport juga menunjukkan cara meng-override method hook untuk menyesuaikan header, sedangkan SalesReport menggunakan perilaku default. Inilah pola Template Method: struktur algoritma ditetapkan di class dasar, tetapi detailnya fleksibel.

Coba sendiri

#include <iostream>
#include "Reports.h"

using namespace std;

int main() {
    // Baca input
    int salesAmount;
    int inventoryCount;
    cin >> salesAmount;
    cin >> inventoryCount;
    
    // TODO: Buat SalesReport dengan salesAmount lalu hasilkan laporannya
    
    // TODO: Cetak satu baris kosong di antara laporan
    
    // TODO: Buat InventoryReport dengan inventoryCount lalu hasilkan laporannya
    
    return 0;
}
quiz iconUji dirimu

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

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online