Şablon Metot Kalıbı (Template Method Pattern)

Eyl 08, 2013

Şablon metot kalıbı davranışsal tasarım kalıpları grubunda yer alır. Şablon metot kalıbı bir işlem için gerekli adımları soyut olarak tanımlar ve bir şablon metot ile algoritmanın nasıl çalışacağını belirler. Alt sınıflar algoritma için gerekli bir ya da birden fazla metodu kendi bünyelerinde gerçekleyerek kullanılan algoritmanın kendi istekleri doğrultusunda çalışmasını sağlarlar. Böylece hem kod tekrarının önüne geçilerek kodun tekrar kullanılabilirliği hem de algoritma iskeletinde yapılacak bir düzenlemenin tek bir yerden yapılması sağlanır. Örneğin ata sınıfa (parent class) konulacak ve tanımlaması yapılmış bir yöntemle, alt sınıfın akışına müdahale etmesi sağlanabilir.

Şablon Metot Kalıbı UML Diyagramı



Diyagramda gösterilen TemplateMethod ve PrimitiveOperation örnek uygulama üzerinde yorum olarak belirtilmiştir. PrimitiveOperation birden fazla olabilir fakat örnek uygulamada sadece bir tane kullanılmıştır.

Örnek Uygulama:

using System;

namespace SablonMetotKalibi
{
    public abstract class SicakIcecek
    {
        public virtual void SuKaynat()
        {
            Console.WriteLine("Su kaynatıldı.");
        }

        // PrimitiveOperation
        public abstract void Icerik();

        public virtual void BardagaDoldur()
        {
            Console.WriteLine("İçeçek bardağa dolduruldu.");
        }

        // TemplateMethod
        public void Hazirla()
        {
            SuKaynat();
            Icerik();
            BardagaDoldur();
            Console.WriteLine("İçeçek hazırlandı.");
        }
    }
   
    public class Cay : SicakIcecek
    {   
        public override void Icerik()
        {
            Console.WriteLine("Çay demlendi.");
        }
    }
   
    public class Nescafe : SicakIcecek
    {
        public override void Icerik()
        {
            Console.WriteLine("Nescafe ve süt tozu konuldu.");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            SicakIcecek cay = new Cay();
            cay.Hazirla();

            Console.WriteLine();

            SicakIcecek nescafe = new Nescafe();
            nescafe.Hazirla();

            Console.ReadLine();
        }
    }
}

Yukarıdaki örnekte "SicakIcecek" atasınıf(parent class)ı içerisinde bir "Hazirla" şablon metodu hazırlanmış, çay ve nescafe içecekleri için gerekli yerlerde değişiklik yaparak kullanılmıştır. Bu şablon içinde tanımlanmış "SuKaynat" ve "BardagaDoldur" fonksiyonlarının tüm içecekler için aynı olması nedeniyle bu fonksiyonlar geçersiz kılınması isteğe bağlı olacak şekilde şekilde yani virtual olarak tanımlanmıştır. "Icerik" fonksiyonu ise çay ve nescafe için farklılık göstereceğinden bu fonksiyon tanımlanması zorunlu olacak şekilde abstract olarak tanımlanmıştır. Çay ve Nescafe alt sınıflarında "Icerik" farklı olarak tanımlanmış ve daha sonra "Hazirla" metodu çağırılarak program çıktıları elde edilmiştir. Bu durumda programa yeni bir içecek eklenmesi gerektiğinde bütün kodları kopyalamak yerine yeni içecek sınıfını "SicakIcecek" ata sınıf(parent class)ından türetip "Icerik" metodunu tanımlamak yeterli olur. Böylece hem kod tekrarının önüne geçilmiş hem de sade ve anlaşılır bir kod yazılmış  olur.

Örnek Uygulama Çıktısı