Merhaba,
Behavioral Patterns(Davranışsal Kalıplar) kategorisinde bulunan Template Method Design Pattern üzerine içerik oluşturacağız.
Template, kelime manasından da anlaşılacağı üzere şablon demektir. Haliyle yaptığımız faaliyetin inşasında belirli şablonsal algorimalar üzerinde çalışma gerçekleştirecek ve bu algoritmada değişkenlik gösteren noktalarda Template Method Design Pattern’i devreye sokacağız.
Düşünün ki, belirli yapılar için benzer algoritmalar kullanacaksınız. Ve bu algoritmalarda değişkenlik genele değil, özele göre kendini gösterecektir. Yani demem o ki, yapılacak işlemlerin algoritmaları x, y ve z olsun ve bu algoritmaların içerik yapısı sırasıyla (3, 5, 7), (3, 2, 7) ve (3, 9, 7) olsunlar. Dikkat ederseniz eğer, algoritmalarda 1. hane “3” ve 3. hane “7” hep aynı işlevi gerçekleştirmekteyken, 2. haneler değişkenlik göstermektedir. Bu da işlemin o anki özel değişken durumunu göstermektedir. Haliyle komple davranış değişmemekte, davranışın bir kısmı değişmektedir. O yüzden Template Method Design Pattern’i tercih etmekteyiz, aksi taktirde Strategy Design Pattern‘i ile durumu değerlendiriyor olurduk.
Strategy Design Pattern‘i davranışın tamamen değiştiği durumlarda, Template Method Design Pattern’i ise davranışın bir kısmı değiştiği durumlarda kullanılır.
Burada dikkat etmemiz gereken nokta, Strategy Design Pattern ile fazladan aynı işi yapacak olan algoritmik çalışma gerçekleştirmektense, var olan kod parçalarının yeniden kullanılabilirliğinin arttırılmasında(Code Reusability) da tercih edildiği görülmektedir.
Peki Nasıl Bir Mantıkla Template Metod Tasarım Deseni Uygulanmaktadır?
Yapmamız gereken çok basittir. Algoritmanın soyut sınıflar üzerinden belirlenerek, somut sınıflarda değişmesine olanak sağlamamız yeterli olacaktır.
Yukarıdaki şablonu incelerseniz eğer Abstract Class içerisinde “TemplateMethod” metodu mevcuttur. İşte asıl kurgu bu metod üzerine yoğunlaşmaktadır. Uygulamada OperationZ, OperationA, OperationY, OperationF ve OperationB gibi metodların olduğunu varsayalım ve bu metodların sıralı operasyonlar şeklinde “TemplateMethod” içerisinde seyredeceğini düşünelim. Lakin dikkat ederseniz Concrete Class’lar OperationA ve OperationB metodlarını uygulamakta ve sıralı operasyondaki özel durumu kendilerine göre farklı bir şekilde yeniden inşa etmektedirler.
Gördüğünüz gibi yukarıdaki şemada Template(Şablon) metod işlevini “TemplateMethod” isimli yordam üstlenmektedir.
Şimdi gelin, bu senaryodaki aktörleri tanıyalım.
- Abstract Class
Template Metodu ve algoritmadaki sıralı operasyonları fiziksel olarak barındıran soyut sınıftır. -
Concrete Class
Operasyonlardan override edilecek olanların uygulandığı sınıflardır.
Örnek Senaryo Uygulaması
Şimdi aşağıdaki gibi bir senaryo üzerinde Template Method D.P. uygulamasını gerçekleştireceğiz.
Senaryomuz; bir alışveriş senaryosu olacaktır ve alınan ürüne göre özel durumlarımız değişecektir.
enum OdemeTipi
{
Pesin, Taksit
}
abstract class Alisveris
{
protected string UrunAdi;
protected OdemeTipi odemeTipi;
void Baslat() => Console.WriteLine("Alışveriş başladı.");
void Bitir() => Console.WriteLine($"Alışveriş bitti.{UrunAdi} {odemeTipi} yöntemiyle alınmıştır.");
abstract public void Urun();
abstract public void OdemeSekli();
public void TemplateMethod()
{
Baslat();
Urun();
OdemeSekli();
Bitir();
}
}
Bu bizim soyut sınıfımızdır. İncelerseniz eğer, Baslat ve Bitir metodları algoritmanın sabit işlevleridirler. Lakin Urun ve OdemeSekli metodları ise özel değişkenlik gösteren durumlar teşkil etmektedir. O yüzden abstract ile işaretlenerek soyut metod haline getirilmişlerdir ve inherit edilen sınıf tarafında uygulanacaklar ve içerikleri doldurulacaktırlar. Ayriyetten TemplateMethod metodumuzda sıralı operasyonlar yerleştirilmiştir.
class Televizyon : Alisveris
{
public override void OdemeSekli()
{
odemeTipi = OdemeTipi.Pesin;
}
public override void Urun()
{
UrunAdi = "Televizyon";
}
}
class Buzdolabi : Alisveris
{
public override void OdemeSekli()
{
odemeTipi = OdemeTipi.Taksit;
}
public override void Urun()
{
UrunAdi = "Buzdolabı";
}
}
Bunlarda bizim Concrete Class’larımızdır. Gördüğünüz gibi özel değişkenlik durumlarını ifade eden metodlarda Concrete’e göre içerik oluşturmuş olduk. Haliyle sıralı operasyonlar bu yapılan yeniliklere göre ceyran edecektir.
class Program
{
static void Main(string[] args)
{
Alisveris a1 = new Televizyon();
a1.TemplateMethod();
Console.WriteLine("***********");
Alisveris a2 = new Buzdolabi();
a2.TemplateMethod();
Console.Read();
}
}
Son olarak Client tarafında yukarıdaki gibi bir örneklendirme gerçekleştirebiliriz. Haliyle projemizi derleyip çalıştırdığımız zaman aşağıdaki ekran görüntüsüyle benzer sonuç elde edilecektir.
Evet, gördüğünüz gibi algoritmada kısmi değişikliğe ihtiyaç olduğu durumlarda Template Method Design Pattern kullanılmaktadır. Unutmamalıdır ki, yukarıda da bahsettiğimiz gibi komple algoritmik değişiklik söz konusu olduğu zamanlarda Strategy Design Pattern‘i kullanmak daha makbuldür.
Sizler de algoritmanın belli olduğu fakat bazı noktalarında algoritma değişikliği gerektiği durumlarda Template Method D.P.’i kullanmaya özen gösteriniz.
Okuduğunuz için teşekkür ederim…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…