Template method deseni
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
-
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.
-
Ş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(); } -
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