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 bawaanPola 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.
Tantangan
MudahMari 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.DocumentGeneratorharus memiliki:Method
finalbernamagenerateDocument()yang mendefinisikan kerangka algoritma dengan memanggil tiga langkah secara berurutan:createHeader(),createBody(), dancreateFooter().Dua method abstrak:
createHeader()dancreateBody()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()mencetakReport 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()mencetakCustomer: [name]pada satu baris, laluAmount Due: $[amount]pada baris berikutnya (format jumlah dengan dua angka di belakang koma).Override
createFooter()agar mencetakThank 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
ReportGeneratordengan judul tersebut dan panggilgenerateDocument(). Cetak satu baris kosong sebagai pemisah. Lalu buatInvoiceGeneratordengan nama pelanggan dan jumlahnya, kemudian panggilgenerateDocument().
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()
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem Pembayaran9Generik
Pengantar GenerikClass GenerikMethod GenerikParameter Tipe BerbatasWildcard (?, extends, super)Ulasan: Wadah Generik12Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola IteratorLatihan sendiri: Compiler Java online