Menu
Coddy logo textTech

Şablon Metot Kalıbı

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 78 / 91.

Şablon Yöntem Deseni, bir algoritmanın iskeletini temel sınıfta tanımlayan ve alt sınıfların genel yapıyı değiştirmeden belirli adımları geçersiz kılmasına olanak tanıyan davranışsal bir tasarım desenidir. Temel sınıf iş akışını kontrol ederken alt sınıflar ayrı parçaları özelleştirir.

Farklı belge türleri oluşturmayı düşünün.

Her belge aynı süreci izler: üst bilgi oluştur, içerik ekle, alt bilgi oluştur. Ancak her adımın ayrıntıları belge türüne göre değişir. Şablon yöntemi bu sıralamayı tanımlarken alt sınıflar ayrıntıları uygular.

<?php
abstract class DocumentGenerator {
    // Şablon metodu - algoritma yapısını tanımlar
    public final function generate(): string {
        $output = $this->createHeader();
        $output .= $this->createContent();
        $output .= $this->createFooter();
        return $output;
    }
    
    // Alt sınıflar tarafından uygulanacak adımlar
    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();

Çıktı:

<html><head></head><body><p>Hello World</p></body></html>
=== DOCUMENT ===
Hello World
=== END ===

Şablon metodundaki final anahtar sözcüğüne dikkat edin. Bu, alt sınıfların algoritmanın yapısını değiştirmesini engeller. Bu kalıp, aynı iş akışını izleyen ancak uygulama ayrıntıları farklı olan birden çok sınıfınız olduğunda idealdir. Yeni bir belge türü eklemek, mevcut koda dokunmadan yeni bir alt sınıf oluşturmak anlamına gelir.

challenge icon

Görev

Kolay

Şablon Metodu Kalıbını kullanarak bir rapor oluşturma sistemi geliştirelim. Farklı rapor türleri aynı yapıyı izler: başlık bölümü, veri bölümü ve özet bölümü; ancak her rapor türü bu bölümleri farklı biçimlendirir. Şablon metodu bu iş akışını tanımlarken alt sınıflar her adımı özelleştirir.

Kodunuzu dört dosyaya dağıtacaksınız:

  • ReportGenerator.php: Rapor oluşturma algoritmasının iskeletini tanımlayan soyut bir ReportGenerator sınıfı oluşturun. Sınıfınız:
    • Yapıcısında bir rapor başlığı kabul etmeli (yapıcı destekli özellik tanımlamayı kullanın)
    • final, generate(): string ve createTitle() olmak üzere üç adımı sırayla çağıran ve sonuçlarını birleştiren createBody() public createSummary() metoduna sahip olmalı
    • Alt sınıfların uygulaması gereken üç soyut protected metot tanımlamalı: createTitle(): string, createBody(): string ve createSummary(): string
  • HtmlReport.php: ReportGenerator dosyasını dahil edin ve ondan türeyen bir HtmlReport sınıfı oluşturun. Bu rapor, çıktıyı HTML olarak biçimlendirir:
    • createTitle(), "<h1>[title]</h1>" döndürür
    • createBody(), "<p>Report data goes here</p>" döndürür
    • createSummary(), "<footer>End of report</footer>" döndürür
  • PlainTextReport.php: ReportGenerator dosyasını dahil edin ve ondan türeyen bir PlainTextReport sınıfı oluşturun. Bu rapor basit metin biçimlendirmesi kullanır:
    • createTitle(), "### [title] ###\n" döndürür
    • createBody(), "Report data goes here\n" döndürür
    • createSummary(), "--- End of report ---" döndürür
  • main.php: Her iki rapor dosyasını dahil edin. İki girdi alacaksınız: bir rapor türü ("html" veya "text") ve bir rapor başlığı.

    Rapor türüne göre, verilen başlıkla uygun rapor oluşturucuyu oluşturun. generate() metodunu çağırın ve raporun tamamını yazdırın.

Şablon Metodu Kalıbı, her raporun aynı üç adımlı yapıyı izlemesini sağlarken her rapor türünün bölümlerini kendine özgü biçimde biçimlendirmesine olanak tanır. final üzerindeki generate() anahtar sözcüğü, alt sınıfların algoritmanın sırasını değiştirmesini önler. Alt sınıflar yalnızca tek tek adımları özelleştirebilir.

Kendin dene

<?php

require_once 'HtmlReport.php';
require_once 'PlainTextReport.php';

// Girişi oku
$reportType = trim(fgets(STDIN));
$reportTitle = trim(fgets(STDIN));

// TODO: Rapor türüne ("html" veya "text") göre,
// verilen başlıkla uygun rapor oluşturucuyu oluştur

// TODO: generate() metodunu çağır ve tam raporu yazdır

?>
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online PHP derleyicisi