Menu
Coddy logo textTech

Ş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 kaydediliyor

Template 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.

challenge icon

Görev

Kolay

Template 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. DocumentGenerator sınıfınız şunlara sahip olmalıdır:

    Sırasıyla üç adımı çağırarak algoritma iskeletini tanımlayan generateDocument() adında bir final metot: createHeader(), createBody() ve createFooter().

    Alt sınıfların uygulaması gereken iki soyut metot: createHeader() ve createBody().

    --- End of Document --- yazdıran varsayılan bir uygulamaya sahip bir kanca (hook) metodu createFooter().

  • 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() metodu Report 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ıra Customer: [name], ardından sonraki satıra Amount Due: $[amount] yazdırır (tutarı iki ondalık basamak olacak şekilde biçimlendirin).

    Thank you for your business! yazdırmak için createFooter() 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 ReportGenerator oluşturun ve generateDocument() metodunu çağırın. Ayırmak için boş bir satır yazdırın. Ardından müşteri adı ve tutar ile bir InvoiceGenerator oluşturun ve generateDocument() 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 location

Temel ö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
        
    }
}
quiz iconKendini test et

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