Ş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.
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 birReportGeneratorsı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(): stringvecreateTitle()olmak üzere üç adımı sırayla çağıran ve sonuçlarını birleştirencreateBody()publiccreateSummary()metoduna sahip olmalı- Alt sınıfların uygulaması gereken üç soyut protected metot tanımlamalı:
createTitle(): string,createBody(): stringvecreateSummary(): string
HtmlReport.php: ReportGenerator dosyasını dahil edin ve ondan türeyen birHtmlReportsınıfı oluşturun. Bu rapor, çıktıyı HTML olarak biçimlendirir:createTitle(),"<h1>[title]</h1>"döndürürcreateBody(),"<p>Report data goes here</p>"döndürürcreateSummary(),"<footer>End of report</footer>"döndürür
PlainTextReport.php: ReportGenerator dosyasını dahil edin ve ondan türeyen birPlainTextReportsınıfı oluşturun. Bu rapor basit metin biçimlendirmesi kullanır:createTitle(),"### [title] ###\n"döndürürcreateBody(),"Report data goes here\n"döndürürcreateSummary(),"--- 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
?>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 SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarı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ıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi