Menu
CoddyTech

Pola Template Method

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 73 dari 87.

Template Method Pattern adalah pola desain perilaku yang mendefinisikan kerangka algoritma di dalam class dasar, sehingga subclass dapat mengganti langkah-langkah tertentu tanpa mengubah struktur keseluruhan. Bayangkan seperti resep: proses memasak secara umum tetap sama, tetapi bahan atau teknik tertentu dapat berbeda.

Pola ini menggunakan abstract class dengan template method yang memanggil serangkaian langkah. Beberapa langkah memiliki implementasi default, sementara langkah lainnya bersifat abstrak dan harus diimplementasikan oleh subclass:

abstract class DataProcessor {
    // Template method: menentukan struktur algoritma
    public final void process() {
        readData();
        processData();
        saveData();
    }
    
    abstract void readData();
    abstract void processData();
    
    // Implementasi bawaan (hook method)
    void saveData() {
        System.out.println("Saving to default location");
    }
}

class CSVProcessor extends DataProcessor {
    void readData() {
        System.out.println("Reading CSV file");
    }
    
    void processData() {
        System.out.println("Parsing CSV data");
    }
}

class XMLProcessor extends DataProcessor {
    void readData() {
        System.out.println("Reading XML file");
    }
    
    void processData() {
        System.out.println("Parsing XML data");
    }
}

Template method biasanya ditandai dengan final untuk mencegah subclass mengubah struktur algoritma. Saat dipanggil, method ini menjalankan urutan yang sama untuk semua subclass:

DataProcessor csv = new CSVProcessor();
csv.process();
// Output:
// Membaca file CSV
// Mengurai data CSV
// Menyimpan ke lokasi bawaan

Pola Template Method sangat cocok saat kamu memiliki algoritma yang memiliki struktur sama, tetapi berbeda pada langkah-langkah tertentu. Pola ini mendorong penggunaan ulang kode dengan menempatkan logika umum di class dasar, sekaligus memungkinkan penyesuaian melalui pewarisan.

challenge icon

Tantangan

Mudah

Mari kita bangun sistem pembuatan dokumen menggunakan Template Method Pattern! Kamu akan membuat framework tempat berbagai jenis dokumen (laporan dan faktur) mengikuti proses pembuatan yang sama, tetapi menyesuaikan langkah-langkah tertentu. Ini cocok untuk situasi ketika alur kerja secara keseluruhan tetap, tetapi detailnya berbeda untuk setiap jenis dokumen.

Kamu akan mengatur kodemu dalam empat file:

  • DocumentGenerator.java: Buat class dasar abstrak yang mendefinisikan template method. DocumentGenerator harus memiliki:

    Method final bernama generateDocument() yang mendefinisikan kerangka algoritma dengan memanggil tiga langkah secara berurutan: createHeader(), createBody(), dan createFooter().

    Dua method abstrak: createHeader() dan createBody() yang harus diimplementasikan oleh subclass.

    Method hook createFooter() dengan implementasi bawaan yang mencetak --- End of Document ---.

  • ReportGenerator.java: Buat subclass konkret untuk membuat laporan. Class ini harus menerima judul laporan (String) melalui constructornya.

    Method createHeader() mencetak === REPORT: [title] ===

    Method createBody() mencetak Report content goes here...

    Gunakan footer bawaan yang diwarisi.

  • InvoiceGenerator.java: Buat subclass konkret lainnya untuk membuat faktur. Class ini harus menerima nama pelanggan (String) dan jumlah (double) melalui constructornya.

    Method createHeader() mencetak *** INVOICE ***

    Method createBody() mencetak Customer: [name] pada satu baris, lalu Amount Due: $[amount] pada baris berikutnya (format jumlah dengan dua angka di belakang koma).

    Override createFooter() agar mencetak Thank you for your business!

  • Main.java: Satukan sistem template method-mu! Kamu akan menerima tiga input: judul laporan (String), nama pelanggan (String), dan jumlah faktur (double).

    Buat ReportGenerator dengan judul tersebut dan panggil generateDocument(). Cetak satu baris kosong sebagai pemisah. Lalu buat InvoiceGenerator dengan nama pelanggan dan jumlahnya, kemudian panggil generateDocument().

Kamu akan menerima tiga input secara berurutan: judul laporan (String), nama pelanggan (String), dan jumlah faktur (double).

Contohnya, dengan input Q4 Sales, Acme Corp, dan 1500.00, output-mu akan seperti ini:

=== REPORT: Q4 Sales ===
Report content goes here...
--- End of Document ---

*** INVOICE ***
Customer: Acme Corp
Amount Due: $1500.00
Thank you for your business!

Perhatikan bagaimana kedua jenis dokumen mengikuti proses tiga langkah yang sama, yang didefinisikan dalam template method, tetapi masing-masing menyesuaikan langkah-langkahnya dengan cara berbeda. ReportGenerator menggunakan footer bawaan, sedangkan InvoiceGenerator menyediakan footernya sendiri. Inilah keunggulan method hook dalam Template Method Pattern!

Coba sendiri

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Baca input
        String reportTitle = scanner.nextLine();
        String customerName = scanner.nextLine();
        double invoiceAmount = scanner.nextDouble();
        
        // TODO: Buat ReportGenerator dengan judul, lalu panggil generateDocument()
        
        // TODO: Cetak baris kosong sebagai pemisah
        
        // TODO: Buat InvoiceGenerator dengan nama pelanggan dan jumlah tagihan, lalu panggil generateDocument()
        
    }
}
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 Java online