Strategy Design Pattern(Strateji Tasarım Deseni)

Design Patterns Çağrı ŞİŞMAN 13.12.2015

Strategy Pattern(Strateji deseni) aynı arayüz altında birden fazla çözüm sınıfının saklanmasına ve  kullanıcı nesnelerin hangi sınıfın kullanıldığından haberdar olmaksızın bu sınıfların çalışma yöntemlerini kullanabilmelerine olanak sağlar.

Kullanıcı nesne hangi çözüm sınıfının kullanıldığını bilmez, o çözüm sınıfının implemente edildiği arayüzü bilir.

Context: Kullanıcı nesne

Strategy: Çözüm sınıflarını implemente eden arayüz

Çözüm Sınıfları : ConcreteStrategyA,ConcreteStrategyA

 

 

Hemen bir örnekle açıklayalım.

Bir dosya sıkıştırma işlemi gerçekleştiriyoruz ve burada farklı algoritmalar kullanıyoruz. GZIP ve BZIP gibi. Bu iki yöntemde de yapacağımız iş sıkıştırma işlemi olacak. 

Burada GZIP ve BZIP işlemlerini yapmak için iki çözüm sınıfı tanımlayabilir ve ikisinde de sıkıştırma işlemi yapılacağı için bu iki sınıfın kullanabileceği bir arayüz yazabiliriz.

Yapacağımız işlemlere bağlı olarak yukarıdaki şekle karşılık gelen arayüz,kullanıcı nesne ve çözüm sınıfları aşağıdaki gibi olacaktır.

Context: Compressor

Strategy: ICompression

Çözüm Sınıfları : GZipCompression,BZipCompression

 

public interface ICompression
{

    void Compress();

}

Bu arayüzden implemente edilen GZIP ve BZIP çözüm sınıflarımız ise aşağıdaki gibidir.

public class GZipCompression:ICompression
 {
     public void Compress()
     {
         //GZIP ile işlemler yapılıp dosya kaydetme işlemi yapılır.
     }
 }

 

public class BZipCompression:ICompression
 {
     public void Compress()
     {
         //BZIP ile ilgili işlemler yapılıp dosyaya kaydedilir.
     }
 }

Şu ande elimizde farklı sıkıştırma algoritmalarıyla işlem yapan iki çözüm sınıfımız ve bunları implemente eden bir arayüzümüz var. Şimdi bu algoritmalarla işlem yapacak kullanıcı nesnemize bakalım.

 

public class Compressor
{

    private readonly ICompression _compressor;

    public Compressor(ICompression compressor)
    {
        _compressor = compressor;
    }

    public void Compress()
    {
        _compressor.Compress();

    }

}

 Yukarıda tanımladığımız Compressor kullanıcı sınıfımız hangi çözüm sınıfının kullanılacağını değil, bu sınıfları implemente eden arayüzü bilir.Bu sınıfı kullanarak oluşturacağımız nesnemiz birden tanımladığımız arayüz olan ICompression tipinde bir parametre ister.

Burada izleyeceğimiz stratejiye bağlı olarak ilgili çözüm sınıfını parameter olarak verebiliriz.

private void Form1_Load(object sender, EventArgs e)
{
    var compressor = new Compressor(new GZipCompression());
    compressor.Compress();


}

*Yeni bir algoritmaya ihtiyacımız olduğunu düşünelim. Örneğin Deflate için yeni bir çözüm sınıfı oluşturursak, Compressor sınıfı bundan etkilenmeyecektir. ICompression ile Deflate implemente edilir ve aynı şekilde Compressor sınıfının yapıcı metoduna parametre olarak verilerek çalıştırılabilir.

Faydası olması dileğiyle iyi çalışmalar.

 

 

 


Etiketler: C#