Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class ReportGenerator abstrak yang menentukan kerangka algoritma pembuatan laporan. Class-mu harus:
    • Menerima judul laporan di konstruktornya (gunakan promosi konstruktor)
    • Memiliki method publik final generate(): string yang memanggil tiga langkah secara berurutan: createTitle(), createBody(), dan createSummary(), lalu menggabungkan hasilnya
    • Mendeklarasikan tiga method protected abstrak yang harus diimplementasikan oleh subclass: createTitle(): string, createBody(): string, dan createSummary(): string
  • HtmlReport.php: Sertakan file ReportGenerator dan buat class HtmlReport yang 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 class PlainTextReport yang 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

?>
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 PHP online