Template method gerekli işlemleri soyut olarak tanımlar ve
algoritma iskeleti belirler. Bazı adımların gerçekleştirilmesi alt sınıflara
bırakılır ve bu adımlar gerçekleştirilirken algoritmanın ana yapısı değişmez.
Template method ile alt sınıflardaki ortak adımlarda kod
tekrarının önüne geçilir ve kod tekrar kullanılabilir. Ayrıca bu method
sayesinde kod değiştirilmek istenirse tek bir yerden değiştirilebilir.
Mesela iki tane sınıfımız olsun Class1 ve Class2 adıyla. Bu
sınıflar Base sınıfından türetilsin ve sınıfların ortak fonksiyonları
functionA() ve functionD() olsun. Ortak fonksiyonlar Base sınıfında private
olarak, ortak olmayanlar ise protected içinde abstract olarak tanımlanır. Public
olan process() ise bütün fonksiyonları çağırıcı olarak rol yapar.Koda geçersek:
class Base{
private:
void functionA(){
cout<<"Common function A for both Class1 and
Class2..."<<endl;
}
void functionD(){
cout<<"Common
function D for both Class1 and Class2..."<<endl;
}
protected:
virtual void
functionB()=0;
virtual void
functionC()=0;
virtual void
functionE()=0;
public:
void process(){
functionA();
functionB();
functionC();
functionD();
functionE();
}
};
Base sınıfta protected olarak tanımlanmış ortak olmayan fonksiyonlar, bu sınıftan türetilmiş olan Class1 ve Class2 sınıflarında public olarak tanımlanır ve kendilerine ait özellikleri taşır.
class Class1:public Base{
public:
void functionB(){
cout<<"Function B for Class1..."<<endl;
}
void functionC(){
cout<<"Function C for Class1..."<<endl;
}
void functionE(){
cout<<"Function E for Class1..."<<endl;
}
};
class Class2:public Base{
public:
void functionB(){
cout<<"Function B for Class2..."<<endl;
}
void functionC(){
cout<<"Function C for Class2..."<<endl;
}
void functionE(){
cout<<"Function E for Class2..."<<endl;
}
};
Main de ise nesne oluşturulurken ve process() fonksiyonu çağırılırken:
Base
*c1=new Class1();
Base
*c2=new Class2();
c1->process();
c2->process();