Ş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 (Template Method Pattern), bir algoritmanın iskeletini bir 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 (override) olanak tanıyan davranışsal bir tasarım desenidir. Temel sınıf iş akışını kontrol ederken, alt sınıflar münferit parçaları özelleştirir.
Farklı türde belgeler oluşturmayı düşünün.
Her belge aynı süreci takip eder: başlık 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 (template method) bu diziyi 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 kelimesine dikkat edin. Bu, alt sınıfların algoritmanın yapısını değiştirmesini engeller. Bu desen, aynı iş akışını takip eden ancak uygulama detaylarında farklılık gösteren birden fazla sınıfınız olduğunda idealdir. Yeni bir doküman türü eklemek, mevcut koda dokunmadan yeni bir alt sınıf oluşturmak anlamına gelir.
Görev
KolayTemplate Method Desenini kullanarak bir rapor oluşturma sistemi inşa edelim. Farklı rapor türleri aynı yapıyı takip eder — bir 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ı şekilde biçimlendirir. Template method bu iş akışını tanımlarken, alt sınıflar her bir adımı özelleştirecektir.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
ReportGenerator.php— Rapor oluşturma algoritmasının iskeletini tanımlayan soyut birReportGeneratorsınıfı oluşturun. Sınıfınız şunları yapmalıdır:- Yapıcı metodunda (constructor) bir rapor başlığı kabul etmelidir (constructor promotion kullanın)
- Sırasıyla üç adımı çağıran
finalbir publicgenerate(): stringmetoduna sahip olmalıdır:createTitle(),createBody()vecreateSummary(); bu adımların sonuçlarını birleştirmelidir - Alt sınıfların uygulaması gereken üç adet soyut (abstract) korumalı (protected) metod bildirmelidir:
createTitle(): string,createBody(): stringvecreateSummary(): string
HtmlReport.php— ReportGenerator dosyasını dahil edin ve onu genişleten birHtmlReportsınıfı oluşturun. Bu rapor, çıktıyı HTML olarak biçimlendirir:createTitle()metodu"<h1>" . $this->title . "</h1>"(veya"<h1>[title]</h1>"formatında) döndürürcreateBody()metodu"<p>Report data goes here</p>"döndürürcreateSummary()metodu"<footer>End of report</footer>"döndürür
PlainTextReport.php— ReportGenerator dosyasını dahil edin ve onu genişleten birPlainTextReportsınıfı oluşturun. Bu rapor basit metin biçimlendirmesi kullanır:createTitle()metodu"### " . $this->title . " ###\n"(veya"### [title] ###\n"formatında) döndürürcreateBody()metodu"Report data goes here\n"döndürürcreateSummary()metodu"--- End of report ---"döndürür
main.php— Her iki rapor dosyasını da dahil edin. İki girdi alacaksınız: bir rapor türü ("html"veya"text") ve bir rapor başlığı.Rapor türüne bağlı olarak, verilen başlıkla uygun rapor oluşturucuyu oluşturun.
generate()metodunu çağırın ve tamamlanmış raporu yazdırın.
Template Method Deseni, her rapor türünün kendi bölümlerini benzersiz şekilde biçimlendirmesine izin verirken tüm raporların aynı üç adımlı yapıyı izlemesini sağlar. generate() metodu üzerindeki final anahtar kelimesi, alt sınıfların algoritmanın sırasını değiştirmesini engeller — onlar sadece bireysel adımları özelleştirebilirler.
Kopya kağıdı
Template Method Deseni, bir algoritmanın iskeletini bir temel sınıfta tanımlar ve alt sınıfların genel yapıyı değiştirmeden belirli adımları geçersiz kılmasına (override) olanak tanır.
Temel sınıf, iş akışı sırasını kontrol eden bir şablon metod içerir. Bu metod, alt sınıfların algoritmanın yapısını değiştirmesini önlemek için genellikle final olarak işaretlenir.
Alt sınıflar, algoritmanın bireysel adımlarını özelleştirmek için soyut (abstract) metodları uygular.
<?php
abstract class DocumentGenerator {
// Şablon metod - 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ın uygulaması gereken soyut 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>";
}
}
$html = new HtmlDocument();
echo $html->generate();
Temel özellikler:
- Algoritma yapısının değiştirilmesini önlemek için şablon metod
finalolarak işaretlenir - Soyut metodlar, alt sınıflar için özelleştirme noktalarını tanımlar
- Birden fazla sınıfın aynı iş akışını takip ettiği ancak uygulama detaylarında farklılık gösterdiği durumlar için idealdir
- Yeni varyantlar eklemek, mevcut kodu değiştirmeden sadece yeni alt sınıflar oluşturmayı gerektirir
Kendin dene
<?php
require_once 'HtmlReport.php';
require_once 'PlainTextReport.php';
// Girdiyi oku
$reportType = trim(fgets(STDIN));
$reportTitle = trim(fgets(STDIN));
// YAPILACAK: Rapor türüne ("html" veya "text") bağlı olarak,
// verilen başlıkla uygun rapor oluşturucuyu oluşturun
// YAPILACAK: generate() işlevini çağırın ve raporun tamamını yazdırın
?>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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi