Harun Özer


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

<< State Tasarım Deseni - State Design Pattern | Template Method Tasarım Deseni - Template Method Design Pattern>>

Strategy Tasarım Deseni - Strategy Design Pattern

Yazar harunozer 02 December 2012

Strategy Tasarım Deseni - Strategy Design Pattern Strategy tasarım deseni behavioral grubuna ait, bir işlemin birden fazla şekilde gerçekleştirile bilineceği durumları düzenleyen tasarım desenidir. Dofactory.com a göre kullanım sıklığı %80 civarıdır ve uygulanması basit tasarım desenlerindendir.

Bir işlemin birden fazla şekilde gerçekleştirile bilinmesi derken uygulamamızda log tutma işlemi yapılmasını, birden fazla şekilde derken de dosya bazlı, veri tabanı bazlı log tutmak gibi farklı log tutma şekillerini örnek olarak verebiliriz. Bu örnekleri çoğaltmak da mümkündür. Örneğin farklı şifreleme işlemleri yapmak, farklı serileştirme işlemleri yapmak gibi. Sanırım strategy tasarım deseninin uml şeması daha açıklayıcı olacaktır.

Uml şemasından da anlaşılacağı üzere Context nesnesi içinde Strategy referansı barındırır yani Strategy arayüzünden türeyen nesneleri barındırır. Strategy arayüzünde ise farklı şekillerde gerçekleştirilecek işlemler tanımlanır. Sifrele – SifreCoz, Encrypte – Decrypte, LogYaz gibi. Bu işlemler gerçekleştirilirken direkt ConcreteStrategyA, ConcreteStrategyB nesneleri ile değil Context nesnesi kullanılır. Context nesnesine hangi ConcreteStrategy nesnesine göre çalışacağı verilir ve kullanılacak işlemler Context üzerinden çalıştırılarak verdiğimiz ConcreteStrategy nesnesine göre işlemi gerçekleştirmiş oluruz.

Şairin dediği gibi “az laf çok iş” diyerek örnek bir uygulama yaparak strategy tasarım desenini daha iyi kavrayalım. Örnek uygulamamız log tutma senaryosuna göre olsun. Uygulamamızın class diyagramı aşağıdadır.

Uygulamamızın kodları aşağıdaki gibidir.
//strategy yapısı
interface ILogStrategy
{
    void InsertLog(string LogValue);
}

//ConcreteStrategy1
class LogFile:ILogStrategy
{
    public void InsertLog(string LogValue)
    {
        Console.WriteLine("File bazlı log yazıldı.");
    }
}
//ConcreteStrategy2
class LogDb : ILogStrategy
{
    public void InsertLog(string LogValue)
    {
        Console.WriteLine("Veri tabanı bazlı log yazıldı.");
    }
}
//Context yapısı
class LogWriter
{
    ILogStrategy logstrategy;
    public LogWriter(ILogStrategy LogStrategy)
    {
        logstrategy = LogStrategy;
    }
    public void LogInsert(string LogValue)
    {
        logstrategy.InsertLog(LogValue);
    }
}
class Program
{
    static void Main(string[] args)
    {
        //direkt LogDb veya LogFile nesnelerini kullanmayıp
        //LogWriter üzerinden erişimi sağlıyoruz.
        LogWriter lw = new LogWriter(new LogFile());
        lw.LogInsert("ins1");
        lw = new LogWriter(new LogDb());
        lw.LogInsert("ins2");
        /*
            diyelim ki sonradan uygulamamızın registry bazlı log tutmasını istedik.
            tek yapmamız gereken yeni bir ConcreteStrategy yapısı oluşturmak.
            tabiki bütün loglar aynı şekilde tutulacak ise Constructor a parametre
            vermek yerine LogWriter Constructor da direkt istediğimiz Concrete türünü oluşturabiliriz.
        */
        Console.ReadKey();
    }
}
 
Örnek uygulamayı aşağıdaki linkden indirebilirsiniz.

StrategySample.rar

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

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