Menu
CoddyTech

Pola Template Method

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 97 dari 110.

Pola Template Method mendefinisikan kerangka algoritma dalam base class, sehingga subclass dapat mengganti langkah tertentu tanpa mengubah struktur keseluruhan. Base class mengendalikan alur kerja, sementara subclass menyesuaikan setiap langkah.

Pola ini menggunakan pewarisan: sebuah abstract class mendefinisikan method templat yang memanggil serangkaian langkah. Beberapa langkah bersifat abstrak (harus diimplementasikan oleh subclass), sedangkan beberapa lainnya memiliki implementasi bawaan:

abstract class DataProcessor {
  // Template method: menentukan struktur algoritma
  void process() {
    readData();
    processData();
    saveData();
  }

  void readData();      // Abstrak: subclass harus mengimplementasikannya
  void processData();   // Abstrak: subclass harus mengimplementasikannya

  void saveData() {     // Implementasi bawaan
    print('Data saved to database');
  }
}

class CsvProcessor extends DataProcessor {
  @override
  void readData() => print('Reading CSV file');

  @override
  void processData() => print('Parsing CSV rows');
}

class JsonProcessor extends DataProcessor {
  @override
  void readData() => print('Reading JSON file');

  @override
  void processData() => print('Parsing JSON objects');

  @override
  void saveData() => print('Saved to cloud storage');
}

void main() {
  var csv = CsvProcessor();
  csv.process();
  // Membaca file CSV
  // Mengurai baris CSV
  // Data disimpan ke database

  var json = JsonProcessor();
  json.process();
  // Membaca file JSON
  // Mengurai object JSON
  // Disimpan ke penyimpanan cloud
}

method process() adalah templat, yang menentukan urutan operasi. Subclass mengimplementasikan readData() dan processData() dengan cara yang berbeda, dan dapat secara opsional meng-override saveData(). Manfaat utamanya adalah struktur algoritma tetap konsisten di semua implementasi, sambil memberi fleksibilitas pada setiap langkah.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pembuatan laporan menggunakan pola Template Method! Kamu akan membuat framework tempat berbagai jenis laporan mengikuti struktur umum yang sama, tetapi setiap jenis laporan menyesuaikan langkah tertentu, seperti mengumpulkan data dan memformat output.

Kamu akan membagi kodemu ke dalam dua file:

  • report_generator.dart: File ini berisi base class abstrak dan implementasi laporan konkret. Buat class abstrak ReportGenerator dengan method template bernama generate() yang menentukan alur kerja pembuatan laporan dalam urutan ini: fetchData(), analyzeData(), formatReport(), dan deliver(). Method fetchData() dan formatReport() harus abstrak (setiap jenis laporan menangani method ini secara berbeda), sedangkan analyzeData() harus mencetak Analyzing data... dan deliver() harus mencetak Report delivered via email. sebagai implementasi default. Kemudian, buat dua class laporan konkret:
    • SalesReport: fetchData()-nya mencetak Fetching sales data from database... dan formatReport()-nya mencetak Formatting as bar charts and tables.
    • InventoryReport: fetchData()-nya mencetak Fetching inventory levels from warehouse..., formatReport()-nya mencetak Formatting as inventory list., dan class ini meng-override deliver() untuk mencetak Report sent to warehouse manager.
  • main.dart: Impor file pembuat laporanmu dan tunjukkan bagaimana pola Template Method menjaga struktur algoritma tetap konsisten sekaligus memungkinkan kustomisasi. Buat SalesReport dan panggil method generate()-nya. Kemudian, cetak baris kosong sebagai pemisah. Buat InventoryReport dan panggil juga method generate()-nya.

Perhatikan bahwa kedua laporan mengikuti proses empat langkah yang sama, tetapi masing-masing menyesuaikan langkah yang penting untuk tujuan spesifiknya. InventoryReport bahkan meng-override method pengiriman default untuk mengirim laporan kepada penerima yang berbeda!

Output yang diharapkan:

Fetching sales data from database...
Analyzing data...
Formatting as bar charts and tables.
Report delivered via email.

Fetching inventory levels from warehouse...
Analyzing data...
Formatting as inventory list.
Report sent to warehouse manager.

Coba sendiri

import 'report_generator.dart';

void main() {
  // TODO: Buat SalesReport dan panggil method generate() miliknya

  // TODO: Cetak satu baris kosong sebagai pemisah

  // TODO: Buat InventoryReport dan panggil method generate() miliknya
}
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 Dart online