Şablon Metot Kalıbı
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 73 / 87.
Template Method Deseni (Template Method Pattern), bir temel sınıfta bir algoritmanın iskeletini 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. Bunu bir yemek tarifi gibi düşünün: genel pişirme süreci aynı kalır, ancak bireysel malzemeler veya teknikler değişebilir.
Bu desen, bir dizi adımı çağıran bir şablon yöntem (template method) içeren bir soyut sınıf kullanır. Bazı adımlar varsayılan uygulamalara sahipken, diğerleri soyuttur ve alt sınıflar tarafından uygulanmalıdır:
abstract class DataProcessor {
// Şablon metodu - algoritma yapısını tanımlar
public final void process() {
readData();
processData();
saveData();
}
abstract void readData();
abstract void processData();
// Varsayılan uygulama (kanca metodu)
void saveData() {
System.out.println("Saving to default location");
}
}
class CSVProcessor extends DataProcessor {
void readData() {
System.out.println("Reading CSV file");
}
void processData() {
System.out.println("Parsing CSV data");
}
}
class XMLProcessor extends DataProcessor {
void readData() {
System.out.println("Reading XML file");
}
void processData() {
System.out.println("Parsing XML data");
}
}Şablon metodu, alt sınıfların algoritmanın yapısını değiştirmesini engellemek için genellikle final olarak işaretlenir. Çağrıldığında, tüm alt sınıflar için aynı sırayı yürütür:
DataProcessor csv = new CSVProcessor();
csv.process();
// Çıktı:
// CSV dosyası okunuyor
// CSV verisi ayrıştırılıyor
// Varsayılan konuma kaydediliyorTemplate Method Deseni, aynı yapıya sahip ancak belirli adımlarda farklılık gösteren algoritmalarınız olduğunda idealdir. Ortak mantığı temel sınıfa yerleştirerek kodun yeniden kullanılabilirliğini teşvik ederken, kalıtım yoluyla özelleştirmeye olanak tanır.
Görev
KolayTemplate Method Desenini kullanarak bir belge oluşturma sistemi inşa edelim! Farklı belge türlerinin (raporlar ve faturalar) aynı oluşturma sürecini takip ettiği ancak belirli adımları özelleştirdiği bir çerçeve oluşturacaksınız. Bu, genel iş akışının sabit olduğu ancak ayrıntıların belge türüne göre değiştiği senaryolar için mükemmeldir.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
DocumentGenerator.java: Şablon metodunu tanımlayan soyut temel sınıfı oluşturun.DocumentGeneratorsınıfınız şunlara sahip olmalıdır:Sırasıyla üç adımı çağırarak algoritma iskeletini tanımlayan
generateDocument()adında birfinalmetot:createHeader(),createBody()vecreateFooter().Alt sınıfların uygulaması gereken iki soyut metot:
createHeader()vecreateBody().--- End of Document ---yazdıran varsayılan bir uygulamaya sahip bir kanca (hook) metoducreateFooter().ReportGenerator.java: Rapor oluşturmak için somut bir alt sınıf oluşturun. Yapıcısı (constructor) aracılığıyla bir rapor başlığı (String) almalıdır.createHeader()metodu=== REPORT: [title] ===yazdırır.createBody()metoduReport content goes here...yazdırır.Kalıtımla alınan varsayılan alt bilgiyi (footer) kullanın.
InvoiceGenerator.java: Fatura oluşturmak için başka bir somut alt sınıf oluşturun. Yapıcısı aracılığıyla bir müşteri adı (String) ve bir tutar (double) almalıdır.createHeader()metodu*** INVOICE ***yazdırır.createBody()metodu bir satıraCustomer: [name], ardından sonraki satıraAmount Due: $[amount]yazdırır (tutarı iki ondalık basamak olacak şekilde biçimlendirin).Thank you for your business!yazdırmak içincreateFooter()metodunu geçersiz kılın (override).Main.java: Şablon metot sisteminizi bir araya getirin! Üç girdi alacaksınız: bir rapor başlığı (String), bir müşteri adı (String) ve bir fatura tutarı (double).Başlık ile bir
ReportGeneratoroluşturun vegenerateDocument()metodunu çağırın. Ayırmak için boş bir satır yazdırın. Ardından müşteri adı ve tutar ile birInvoiceGeneratoroluşturun vegenerateDocument()metodunu çağırın.
Sırasıyla üç girdi alacaksınız: rapor başlığı (String), müşteri adı (String) ve fatura tutarı (double).
Örneğin, Q4 Sales, Acme Corp ve 1500.00 girdileriyle çıktınız şöyle olacaktır:
=== REPORT: Q4 Sales ===
Report content goes here...
--- End of Document ---
*** INVOICE ***
Customer: Acme Corp
Amount Due: $1500.00
Thank you for your business!Her iki belge türünün de şablon metodunda tanımlanan aynı üç adımlı süreci nasıl takip ettiğine, ancak her birinin adımları nasıl farklı şekilde özelleştirdiğine dikkat edin. ReportGenerator varsayılan alt bilgiyi kullanırken, InvoiceGenerator kendi alt bilgisini sağlar; işte bu, Template Method Desenindeki kanca (hook) metotların gücüdür!
Kopya kağıdı
Şablon Metot 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 olanak tanıyan davranışsal bir tasarım desenidir.
Bu desen, bir dizi adımı çağıran bir şablon metot içeren soyut bir sınıf kullanır. Bazı adımların varsayılan uygulamaları vardır, diğerleri ise soyuttur ve alt sınıflar tarafından uygulanmalıdır:
abstract class DataProcessor {
// Şablon metot - algoritma yapısını tanımlar
public final void process() {
readData();
processData();
saveData();
}
abstract void readData();
abstract void processData();
// Varsayılan uygulama (hook metodu)
void saveData() {
System.out.println("Saving to default location");
}
}Somut alt sınıflar soyut metotları uygular:
class CSVProcessor extends DataProcessor {
void readData() {
System.out.println("Reading CSV file");
}
void processData() {
System.out.println("Parsing CSV data");
}
}Şablon metot, alt sınıfların algoritmanın yapısını değiştirmesini önlemek için final olarak işaretlenir. Çağrıldığında, tüm alt sınıflar için aynı diziyi yürütür:
DataProcessor csv = new CSVProcessor();
csv.process();
// Çıktı:
// Reading CSV file
// Parsing CSV data
// Saving to default locationTemel özellikler:
- Şablon metot
final'dır ve algoritma yapısını tanımlar - Soyut metotlar alt sınıflar tarafından uygulanmalıdır
- Hook metotları, isteğe bağlı olarak geçersiz kılınabilen varsayılan uygulamalar sağlar
- Ortak mantığı temel sınıfa yerleştirerek kodun yeniden kullanımını teşvik eder
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String reportTitle = scanner.nextLine();
String customerName = scanner.nextLine();
double invoiceAmount = scanner.nextDouble();
// TODO: Başlık ile bir ReportGenerator oluşturun ve generateDocument() metodunu çağırın
// TODO: Ayırmak için boş bir satır yazdırın
// TODO: Müşteri adı ve tutar ile bir InvoiceGenerator oluşturun ve generateDocument() metodunu çağı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 Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarı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ıYineleyici Kalıbı