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.
Tantangan
MudahMari 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 abstrakReportGeneratordengan method template bernamagenerate()yang menentukan alur kerja pembuatan laporan dalam urutan ini:fetchData(),analyzeData(),formatReport(), dandeliver(). MethodfetchData()danformatReport()harus abstrak (setiap jenis laporan menangani method ini secara berbeda), sedangkananalyzeData()harus mencetakAnalyzing data...dandeliver()harus mencetakReport delivered via email.sebagai implementasi default. Kemudian, buat dua class laporan konkret:SalesReport:fetchData()-nya mencetakFetching sales data from database...danformatReport()-nya mencetakFormatting as bar charts and tables.InventoryReport:fetchData()-nya mencetakFetching inventory levels from warehouse...,formatReport()-nya mencetakFormatting as inventory list., dan class ini meng-overridedeliver()untuk mencetakReport sent to warehouse manager.
main.dart: Impor file pembuat laporanmu dan tunjukkan bagaimana pola Template Method menjaga struktur algoritma tetap konsisten sekaligus memungkinkan kustomisasi. BuatSalesReportdan panggil methodgenerate()-nya. Kemudian, cetak baris kosong sebagai pemisah. BuatInventoryReportdan panggil juga methodgenerate()-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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses Pembayaran12OOP Asinkron
Futures & async/awaitDasar-Dasar StreamPengontrol StreamKonstruktor AsinkronAsync dalam Method ClassRangkuman: Pengambil Data15Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola RepositoryLatihan sendiri: Compiler Dart online