Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Strategy Tasarım Deseni - Strategy Design Pattern | Visitor Tasarım Deseni - Visitor Design Pattern>>

Template Method Tasarım Deseni - Template Method Design Pattern

Yazar harunozer 02 December 2012

Template Method Tasarım Deseni - Template Method Design Pattern Template tasarım deseni; behavioral grubuna ait bir algoritmanın adımlarının abstract sınıfta tanımlanarak farklı adımların concrete sınıflarında overwrite edilip çalıştırılmasını düzenler. Dofactory.com a göre kullanım oranı %60 civarındadır.

Template tasarım deseninde bir operasyonu gerçekleştirmek için gerekli olan adımlar ve bu adımları çalıştıracak metotlar abstract bir sınıfta tanımlanır. Bu abstract sınıfı uygulayan gerçek sınıflar gerekli adımları overwrite eder ve abstract sınıfında bu adımları kullanan metotlar çağrılarak işlem gerçekleştirilir. Böylece kod tekrarı yapılmasının önüne geçilmiş olunur. Template tasarım deseninin uml şeması aşağıdadır.

TemplateMethod abstract sınıfında aIslemi ve dIslemi standart bir yapıda olduğu için private olarak tanımlanıp değiştirilmesi engellenmiştir. bIslemi ve cIslemi ise abstract olarak tanımlanıp kendisini uygulayan sınıfların bu metotları ezmesi istenmiştir. Template1 ve Template2 nesnesi ise bu metotlar ezildikten sonra çalışacak olan metotlar için şablon niteliğindeki metotlardır. Görüldüğü gibi ConcreteTemplateMethod sınıfları sadece bIslemi ve cIslemi metotlarını ezmiştir ve sabit olan aIslemi ve dIslemi metotları tekrar yazılmamıştır.

Şimdi örnek bir uygulama ile template tasarım desenini daha iyi anlayalım. Örnek uygulamamızda veri tabanı kayıt eklemek ve bir kaydın var olup olmadığını veren işlemleri ele alalım. Normalde connection bir kez açılır fakat biz her işlemde connecitonu açıp işlem bitince de kapatacağımızı düşünelim. Bu senaryoya template tasarım deseni ile şöyle bir çözüm getirebiliriz. İşlemlerin tanımlı olacağı bir abstract sınıf tanımlarız. Bu sınıfta connection açan OpenCon ve connectionu kapatan CloseCon metotlarını tanımlayalım. Her tablo için kayıt ekleme ve kontrol etme işlemleri farklı olacağından Insert ve CheckData metotlarını abstract olarak tanımlayalım ki Concrete sınıflarda bu metotları overwrite edebilelim. Son olarak da Insert ve CheckData işlemlerini her gerçekleştirirken her seferinde connectionu açma ve kapama işlemlerini tekrar yazmamak için TemplateInsert ve TemplateCheckData isimli iki metot daha ekleyip içlerinde gerekli olan işlemleri çalıştıralım.

Uygulamamızın class diyagramı ve kodları aşağıdadır.

//Template yapısı
abstract class Operation
{
    private void OpenCon()
    {
        Console.WriteLine("Connection Open");
    }

    /*
        bu abstract sınıfı uygulayan sınıfların sadece Insert ve CheckData da yapılacak
        işlemleri overwrite etmesi gereklidir.
    */
    public abstract void Insert();
    public abstract bool CheckData();
    private void CloseCon()
    {
        Console.WriteLine("Connection Close");
    }
    //Bu sınıfı uygulayan sınıfların her işlemde connection u açmaya ve kapatmaya ihtiyacı kalmamıştır.
    //connection açma ve kapama işlemleri TemplateMethod larda yapılıyor.
    public void TemplateInsert()
    {
        OpenCon();
        Insert();
        CloseCon();
    }
    public bool TemplateCheckData()
    {
        OpenCon();
        bool Check = CheckData();
        CloseCon();
        return Check;
    }
}
//ConcreteTemplateMethod
class OperationContact : Operation
{
    //Insert işlemi bu sınıfa göre yazılması gerektiğinden overwrite ediliyor.
    public override void Insert()
    {
        Console.WriteLine("Contact Kayıt Eklendi.");
    }
    public override bool CheckData()
    {
        //Kontroller yapıldığını varsayalım...
        Console.WriteLine("Contact Kayıt Bulundu.");
        return true;
    }
}
//ConcreteTemplateMethod
class OperationProduct : Operation
{
    public override void Insert()
    {
        Console.WriteLine("Product Kayıt Eklendi.");
    }
    public override bool CheckData()
    {
        //Kontroller yapıldığını varsayalım...
        Console.WriteLine("Product Kayıt Bulundu.");
        return true;
    }
}
   
class Program
{
    static void Main(string[] args)
    {
        OperationContact o = new OperationContact();
        o.TemplateInsert();
        OperationProduct op = new OperationProduct();
        o.TemplateCheckData();
        Console.ReadKey();
    }
}
 
Örnek uygulamayı aşağıdaki linkten indirebilirsiniz.

SampleTemplateMethod.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 5  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri