CodeBlanks Logo Icon CodeBlanks

Template method deseni

PHP kursu · Orta seviye · Ders 56/115

Soyut sınıfta bir method iskeleti kurup alt sınıfların adımları doldurmasını öğrenirsin.

Template method deseni

Template method deseni şöyle çalışır: ebeveyn soyut sınıf, bir iş akışının iskeletini (skeleton) somut bir metotla tanımlar. Bu metot, alt sınıfların doldurduğu abstract parçaları çağırır. Buna şablon metot (template method) denir.

Örneğin bir rapor şöyle kurulur: başlık + gövde + alt bilgi. Ebeveyn build() metodu bu sırayı sabit tutar; header() ve body() abstract'tur, alt sınıf uygular. footer() somut olabilir; alt sınıf isterse override eder.

Bu desen, kod tekrarını azaltır ve iş akışını tek yerde toplar.

Hook metotlar: isteğe bağlı genişletme

Bazen ebeveyn, alt sınıfa 'bu adımı atlayabilir veya değiştirebilirsin' der. Buna hook metot denir. Hook, ebeveynde somut (gövdeli) tanımlanır; genellikle boş veya varsayılan bir değer döndürür. Alt sınıf isterse override eder, istemezse varsayılanı kullanır.

Önceki rapor örneğinde footer() bir hook'tur: varsayılan olarak "---\n" döndürür; HtmlReport isterse kendi alt bilgisini yazar.

Bu, abstract metotta olduğu gibi zorunlu değil, opsiyonel bir genişletme noktasıdır. Şablon metot iskeleti bozmaz.

Uygulama Şablon metot: Rapor sistemi

Bir Report soyut sınıfı tanımla. İçinde iki abstract metot bildir: header(): string ve body(): string. Bir concrete (somut) metot olan footer() varsayılan değer döndürsün: return "---\n";. Asıl şablon metot public function build(): string olsun ve şu işi yapsın: return $this->header() . $this->body() . $this->footer();. Sonra HtmlReport sınıfını Report'tan türet, header() ve body() metodlarını uygula. $r = new HtmlReport() ve echo $r->build();

Örnek çözümü göster
Report soyut sınıfında abstract header() ve body() bildir. footer() somut metodu "---\n" döndürsün. build() metodu header+body+footer birleştirsin. HtmlReport alt sınıfı header() ve body()'i uygular.
Örnek çözüm:
<?php
// Report soyut sınıfını tanımla
abstract class Report {
    abstract public function header(): string;
    abstract public function body(): string;

    public function footer(): string {
        return "---\n";
    }

    public function build(): string {
        return $this->header() . $this->body() . $this->footer();
    }
}

class HtmlReport extends Report {
    public function header(): string {
        return "<h1>Başlık</h1>";
    }

    public function body(): string {
        return "<p>İçerik</p>";
    }
}

$r = new HtmlReport();
echo $r->build();

Kendini test et

  1. Template method deseninde 'şablon metot' nedir?

    • Alt sınıfın yazdığı abstract metot
    • Yalnızca statik olan metot
    • Private erişimli gizli metot
    • Ebeveyndeki somut metot; abstract parçaları çağırır
    Cevabı göster

    Ebeveyndeki somut metot; abstract parçaları çağırır — Doğru. Şablon metot ebeveynde somut olarak tanımlanır ve alt sınıfın doldurduğu abstract parçaları çağırır.

  2. Şablon metodu tamamla

        public function build(): string {
            return ____ . $this->body() . $this->footer();
        }
    Cevabı göster
        public function build(): string {
            return $this->header() . $this->body() . $this->footer();
        }
  3. Template method kavramlarını eşleştir

    şablon metot
    İskelet kurar
    abstract parça
    Alt sınıfta uygulanır
    hook metot
    Varsayılan gövdeli
    concrete metot
    Gövdesi tamdır

Orta seviye bölümündeki tüm dersler