Şablon Metot Kalıbı
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 99 / 104.
Template Method deseni, bir algoritmanın iskeletini temel sınıfta tanımlar ve alt sınıfların algoritmanın genel yapısını değiştirmeden belirli adımları geçersiz kılmasına olanak tanır. Tüm algoritmaları değiştiren Strategy deseninin aksine Template Method, algoritmayı sabit tutarken tek tek ad özelleştirilmesine izin verir.
Temel sınıf, şablon yöntemini (algoritmayı) uygular ve alt sınıfların sağlaması gereken soyut veya sanal yöntemleri çağırır:
#include <iostream>
class DataProcessor {
public:
// Şablon metodu - algoritma iskeletini tanımlar
void process() {
loadData();
processData();
saveResults();
}
virtual ~DataProcessor() = default;
protected:
virtual void loadData() = 0; // Uygulanması zorunlu
virtual void processData() = 0; // Uygulanması zorunlu
// Hook - varsayılan davranışla isteğe bağlı override
virtual void saveResults() {
std::cout << "Saving to default location\n";
}
};
class CSVProcessor : public DataProcessor {
protected:
void loadData() override {
std::cout << "Loading CSV file\n";
}
void processData() override {
std::cout << "Parsing CSV data\n";
}
};
class JSONProcessor : public DataProcessor {
protected:
void loadData() override {
std::cout << "Loading JSON file\n";
}
void processData() override {
std::cout << "Parsing JSON data\n";
}
void saveResults() override {
std::cout << "Saving to cloud storage\n";
}
};
int main() {
CSVProcessor csv;
csv.process(); // Varsayılan saveResults kullanır
JSONProcessor json;
json.process(); // Özel saveResults kullanır
}process() yöntemi şablon yöntemidir; sabit adım dizisini tanımlar. Alt sınıflar loadData() ve processData() yöntemlerini farklı şekilde uygular, ancak sıra asla değişmez. saveResults() yöntemi bir "kanca"dır; alt sınıfların isteğe bağlı olarak üzerine yazabileceği varsayılan bir uygulamaya sahiptir.
Sabit adımlara sahip ancak belirli işlemlerde esnekliğe ihtiyaç duyan bir algoritmanız olduğunda veya benzer sınıflar arasında kod tekrarını önlemek istediğinizde Template Method kullanın.
Görev
KolayŞablon Metodu desenini kullanarak bir Report Generator sistemi oluşturalım. Farklı rapor türlerinin (satış raporları ve envanter raporları gibi) aynı oluşturma sürecini izlediği, ancak her rapor türünün belirli adımları özelleştirdiği bir çerçeve oluşturacaksın. Bu, Şablon Metodu için mükemmel bir senaryodur: genel iş akışı sabit kalırken tek tek adımlar değişir.
Kodunu üç dosyada düzenleyeceksin:
ReportGenerator.h: Şablon metoduna sahip soyut temel sınıfı tanımla.Rapor oluşturma algoritmasının iskeletini tanımlayan bir
ReportGeneratorsınıfı oluştur. Şablon metodungenerateReport()şu adımları sırayla yürütmelidir:gatherData(): saf sanal, alt sınıflar tarafından uygulanmalıdırformatReport(): saf sanal, alt sınıflar tarafından uygulanmalıdıraddHeader():--- Report ---yazdıran varsayılan davranışa sahip bir kancaprintReport(): saf sanal, alt sınıflar tarafından uygulanmalıdır
addHeader()metodu, alt sınıfların başlığı özelleştirmek için isteğe bağlı olarak geçersiz kılabileceği bir kanca görevi görür.Reports.h: İki somut rapor oluşturucu uygula.Şunları yapan bir
SalesReportsınıfı oluştur:gatherData(),Gathering sales data from databaseyazdırırformatReport(),Formatting sales figuresyazdırırprintReport(), kurucuya aktarılan amount değerinin kullanıldığıSales Total: $[amount]ifadesini yazdırır
Şunları yapan bir
InventoryReportsınıfı oluştur:gatherData(),Scanning inventory recordsyazdırırformatReport(),Organizing inventory by categoryyazdırıraddHeader(), kancayı geçersiz kılarak=== Inventory Report ===yazdırırprintReport(), kurucuya aktarılan count değerinin kullanıldığıItems in stock: [count]ifadesini yazdırır
Her iki sınıf da kendilerine karşılık gelen değerleri (amount veya count) kurucuları aracılığıyla kabul etmelidir.
main.cpp: Şablon Metodu desenini göster.İki girdi oku:
- Satış tutarı (tam sayı)
- Envanter sayısı (tam sayı)
Satış tutarıyla bir
SalesReportoluştur ve raporu oluştur. Ardından envanter sayısıyla birInventoryReportoluştur ve raporu oluştur. Okunabilirlik için iki raporun arasına boş bir satır yazdır.
Örneğin, 15000 ve 250 girdileriyle:
Gathering sales data from database
Formatting sales figures
--- Report ---
Sales Total: $15000
Scanning inventory records
Organizing inventory by category
=== Inventory Report ===
Items in stock: 2508500 ve 120 girdileriyle:
Gathering sales data from database
Formatting sales figures
--- Report ---
Sales Total: $8500
Scanning inventory records
Organizing inventory by category
=== Inventory Report ===
Items in stock: 120Her iki raporun da generateReport() içinde tanımlanan adımların tam olarak aynı sırasını izlediğine, ancak her birinin bu adımları farklı şekilde uyguladığına dikkat et. InventoryReport ayrıca başlığı özelleştirmek için kanca metodunu geçersiz kılmayı gösterirken, SalesReport varsayılanı kullanır. Bu, Şablon Metodu deseninin uygulamadaki hâlidir: algoritmanın yapısı temel sınıfta sabitlenmiştir, ancak ayrıntılar esnektir.
Kendin dene
#include <iostream>
#include "Reports.h"
using namespace std;
int main() {
// Girdileri oku
int salesAmount;
int inventoryCount;
cin >> salesAmount;
cin >> inventoryCount;
// TODO: salesAmount ile bir SalesReport oluştur ve üret
// TODO: Raporlar arasına boş bir satır yazdır
// TODO: Create an InventoryReport with inventoryCount and generate it
return 0;
}
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 DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı11İleri Düzey OOP Kavramları
Kompozisyon ve Kalıtım KarşılaştırmasıCRTP ile Mixin YapılarıPimpl İdiyomuTür Silme (Type Erasure)Enum Sınıfları ve Güçlü TiplendirmeOOP'de İstisna YönetimiÖzel İstisna Hiyerarşileri14Tasarı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ıBir Kalıp Olarak RAII3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic KonteynerKendi başına pratik yap: Online C++ derleyicisi