C# Template Method Pattern Kullanımı - OOP Design Patterns

Template method bir işlem için gerekli işlemleri soyut olarak tanımlar ve bir metot oluşturarak algoritmanın nasıl çalışacağını belirler. Alt sınıflar algoritma için gerekli bir yada birden fazla işlemi kendi bünyelerinde implemente ederek, kullanılan algoritmanın kendi istekleri doğrultusunda çalışmasını sağlarlar.



Böylece alt sınıfların gerçekleştirmesi gereken ortak kod parçaları sarmalanarak 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ğlanmıştır.

Örneğin bir çay kahve makinası yaptığımızı düşünelim. Kişinin seçimine göre çay ya da nescafe yapıyor makina. Bu makinanıın class diyagramını şu şekilde çıkarabiliriz:


Görüldüğü gibi iki içeceğide hazırlarken aynı metdoları kullanıyoruz. BardagaDoldur, ServisEt, SuKaynat tüm bu metodlar aynı şekilde çalışır fakat biz gittik iki class içinde de aynı şeyleri yazıp durduk. Burada sadece Hazırla metodu iki class için farklı çalışır. Biri sıcak suya çay koyarken digeri ise nescafe koyacaktır. Bu yüzden bu porgramın class diyagramını template metod pattern kullanarak şu şekilde yazabiliriz.



public abstract class SicakIcecek
{
      protected void SuKaynat()
      {
        Console.WriteLine("Su kaynatiliyor..");
      }


      protected void BardagaDoldur()
      {
         Console.WriteLine("Bardaga dolduruluyor..");
      }


      protected void ServisEt()
      {
          Console.WriteLine("Iceceginiz hazir.Teşekkür ederiz..");
      }


      //abstract metodumuz yukarida yazdigimiz tum metotlar icecek siniflarinda ortak
      //olan metotlardi. Bu metodu ise icecek siniflari implemente ederek cay nasil hazirlanacak
      //ise cayi hazirlama islemlerini, nescafe nasil hazirlanacak ise nescafe hazirlama
      //islemlerini burada yapacaktır.
      protected abstract void Hazirla();


      //Template SuKaynat
      public void SicakIcecekHazirla()
      {
           this.SuKaynat();
           this.Hazirla();
           this.BardagaDoldur();
           this.ServisEt();
      }


}



Artık aslında Template Method pattern'imizi tamamladık. Fakat C# Factory Pattern Kullanımı - OOP Design Patterns yazımda anlattığım nedenlerden dolayı burada bir de factory pattern kullanırsak programımız daha güzel olacaktır. Bu yüzden hemen bir factory class yazalım:

public static class SicakIcecekFactory
{
      public static SicakIcecek HazirlamayaBasla(string secim)
      {
           SicakIcecek sicakIcecek;
           switch (secim.ToLower())
           {
              case "cay":
                 sicakIcecek = new Cay();
                 break;
              case "nescafe":
                 sicakIcecek = new Nescafe();
                 break;
              default:
                 sicakIcecek = new Cay();
                 break;
           }
           return sicakIcecek;
      }
}




Bunun ardından artık client tarafında yazılacak kodu yazmamız kaldı:


static void Main(string[] args)
{
     SicakIcecek cay = SicakIcecekFactory.HazirlamayaBasla("cay");
     cay.SicakIcecekHazirla();


     Console.WriteLine();


     SicakIcecek nescafe = SicakIcecekFactory.HazirlamayaBasla("nescafe");
     nescafe.SicakIcecekHazirla();


     Console.ReadLine();
}



Bu durumda program çıktımız:


Buradaki örnekte görüldüğü gibi alt sınıfların gerçekleştirmesi gereken ortak kod parçaları tek bir ana sınıfta toplanarak hem kod tekrarının önüne geçildi hemde kodun tekrar kullanılabilirliği sağlandı. Bunun dışında alt sınıfların yapması gereken farklı işler varsa bu metotlarda abstract tanımlanarak alt sınıflar tarafından implemente edilmesi sağlandı. Son olarakta SicakIcecekHazirla template metodu ile sıcak içecek oluşturma algoritması kuruldu. Böylelikle hem de sıcak içecek oluşturma algoritmasını kurmak clienta bırakılmadı. Örneğin bu metodu yazmamış olsaydık her şeyi client tarafına bıraksaydık. Suyu kaynatmadan çay koy diyebilecekti bu da hataya neden olacaktı. Bu metotla algoritmayı kendimiz oluşturarak bu durumunda önüne geçmiş oldu.

0 yorum :

Yorum Gönder