Pola Template Method
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 78 dari 91.
Template Method Pattern adalah pola desain perilaku yang mendefinisikan kerangka algoritma di dalam base class, sehingga subclass dapat mengganti langkah-langkah tertentu tanpa mengubah struktur keseluruhan. Base class mengendalikan alur kerja, sedangkan subclass menyesuaikan bagian-bagian tertentu.
Pertimbangkan untuk membuat berbagai jenis dokumen.
Setiap dokumen mengikuti proses yang sama: membuat header, menambahkan konten, membuat footer. Namun, detail setiap langkah berbeda-beda menurut jenis dokumen. Template method menentukan urutan ini, sementara subclass menerapkan detailnya.
<?php
abstract class DocumentGenerator {
// Template method ini mendefinisikan struktur algoritma
public final function generate(): string {
$output = $this->createHeader();
$output .= $this->createContent();
$output .= $this->createFooter();
return $output;
}
// Langkah-langkah yang harus diimplementasikan oleh subclass
abstract protected function createHeader(): string;
abstract protected function createContent(): string;
abstract protected function createFooter(): string;
}
class HtmlDocument extends DocumentGenerator {
protected function createHeader(): string {
return "<html><head></head><body>";
}
protected function createContent(): string {
return "<p>Hello World</p>";
}
protected function createFooter(): string {
return "</body></html>";
}
}
class TextDocument extends DocumentGenerator {
protected function createHeader(): string {
return "=== DOCUMENT ===\n";
}
protected function createContent(): string {
return "Hello World\n";
}
protected function createFooter(): string {
return "=== END ===";
}
}
$html = new HtmlDocument();
echo $html->generate() . "\n";
$text = new TextDocument();
echo $text->generate();
Keluaran:
<html><head></head><body><p>Hello World</p></body></html>
=== DOCUMENT ===
Hello World
=== END ===Perhatikan kata kunci final pada template method. Ini mencegah subclass mengubah struktur algoritmanya. Pola ini ideal saat kamu memiliki beberapa class yang mengikuti alur kerja yang sama, tetapi berbeda dalam detail implementasinya. Menambahkan tipe dokumen baru berarti membuat subclass baru tanpa mengubah kode yang sudah ada.
Tantangan
MudahMari kita bangun sistem pembuatan laporan menggunakan Pola Template Method. Berbagai jenis laporan mengikuti struktur yang sama, yaitu bagian judul, bagian data, dan bagian ringkasan, tetapi setiap jenis laporan memformat bagian-bagian ini secara berbeda. Template method akan menentukan alur kerja ini, sementara subclass menyesuaikan setiap langkah.
Kamu akan mengatur kodemu dalam empat file:
ReportGenerator.php: Buat classReportGeneratorabstrak yang menentukan kerangka algoritma pembuatan laporan. Class-mu harus:- Menerima judul laporan di konstruktornya (gunakan promosi konstruktor)
- Memiliki method publik
finalgenerate(): stringyang memanggil tiga langkah secara berurutan:createTitle(),createBody(), dancreateSummary(), lalu menggabungkan hasilnya - Mendeklarasikan tiga method protected abstrak yang harus diimplementasikan oleh subclass:
createTitle(): string,createBody(): string, dancreateSummary(): string
HtmlReport.php: Sertakan file ReportGenerator dan buat classHtmlReportyang merupakan turunannya. Laporan ini memformat output sebagai HTML:createTitle()menghasilkan"<h1>[title]</h1>"createBody()menghasilkan"<p>Report data goes here</p>"createSummary()menghasilkan"<footer>End of report</footer>"
PlainTextReport.php: Sertakan file ReportGenerator dan buat classPlainTextReportyang merupakan turunannya. Laporan ini menggunakan pemformatan teks sederhana:createTitle()menghasilkan"### [title] ###\n"createBody()menghasilkan"Report data goes here\n"createSummary()menghasilkan"--- End of report ---"
main.php: Sertakan kedua file laporan. Kamu akan menerima dua input: jenis laporan ("html"atau"text") dan judul laporan.Berdasarkan jenis laporan, buat generator laporan yang sesuai dengan judul yang diberikan. Panggil
generate()dan cetak laporan lengkapnya.
Pola Template Method memastikan semua laporan mengikuti struktur tiga langkah yang sama, sekaligus memungkinkan setiap jenis laporan memformat bagiannya secara unik. Kata kunci final pada generate() mencegah subclass mengubah urutan algoritma. Subclass hanya dapat menyesuaikan langkah-langkahnya satu per satu.
Coba sendiri
<?php
require_once 'HtmlReport.php';
require_once 'PlainTextReport.php';
// Baca input
$reportType = trim(fgets(STDIN));
$reportTitle = trim(fgets(STDIN));
// TODO: Berdasarkan tipe laporan ("html" atau "text"),
// buat pembuat laporan yang sesuai dengan judul yang diberikan
// TODO: Panggil generate() dan cetak laporan lengkap
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa10Konsep OOP Lanjutan
Komposisi vs PewarisanInjeksi Dependensiclass AnonimEnum (PHP 8.1)Fiber (PHP 8.1)Pendalaman Kloning objectGenerator dan Iterator13Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola Repository2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online