Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# Strategy Design Pattern(Strateji Tasarım Deseni)

Merhaba,

Behavioral Patterns(Davranışsal Kalıplar) kategorisine giren Strategy Design Pattern üzerinde detaylı irdeleme gerçekleştirelim. Bir işlem için birden fazla farklı yöntemlerin uygulanabileceği durumlar mevcuttur. İşte bu tarz durumlarda hangi yöntemin uygulanacağını, hangisinin devreye sokulacağını Strategy Design Pattern ile gerçekleştirebiliyoruz.

C# Strategy Design Pattern(Strateji Tasarım Deseni)

Diyagramda da gördüğünüz gibi bir işlemi gerçekleştirebilmenin “StrategyA”, “StrategyB” ve “StrategyC” isimli üç adet yöntemi mevcuttur. İşlemimizi temsil eden Context sınıfı ise aşağı satırlardaki mantıkla Strategy Design Pattern’i uygulatma gereksinimi doğurmaktadır.

Context, işlemi hangi yöntemle yapacaksa gidip ilgili yöntem adına Context’te güncelleme gerçekleştirmek zorunda kalacak eğer tekrar değişiklik olacaksa tekrar Context içeriğiyle oynamamız gerekecektir. İşte bu durumda, her yöntemi temsil edecek olan, daha doğrusu her yönteme bir şablon, arayüz işlevi görecek olan Strategy arayüzü(interface ya da abstract class olabilir) tanımlanmıştır. Bu arayüz barındırdığı elemanlar olarak tüm görevleri stabilize etmekte ve miras durumunda kasıtlı implement gerçekleştirmekte ve Context sınıfı bu arayüz aracılığıyla işlemlerini gerçekleştirmektedir.

Bu tasarım deseninde temel odak noktamız, Context’in işlemin nasıl yapılacağıyla ilgisini kesmektir.

Gelin bir araba üretim fabrikasını örneklendirerek projemize pratiklik kazandıralım.

Üretilecek araba modelimiz “Opel” olsun.

    class Opel
    {
        public Opel(string UretimTipi)
        {
            Console.WriteLine($"Opel {UretimTipi} üretilmiştir.");
        }
        public string Marka { get; set; }
        public string Model { get; set; }
        public int KM { get; set; }
    }

“Seri Üret”, “Özel Yapım Üret” ve “Şipariş Üzerine Üret” olmak üzere üç adet üretim yöntemimiz olsun.

    class SeriUret
    {
        public Opel Uret()
        {
            return new Opel("seri");
        }
    }
    class OzelYapimUret
    {
        public Opel Uret()
        {
            return new Opel("özel yapım");
        }
    }
    class SiparisUzerineUret
    {
        public Opel Uret()
        {
            return new Opel("sipariş üzerine");
        }
    }

Şimdi Strategy Design Pattern olmaksızın araçlarımızı ürettirelim.

    class Uretici
    {
        public Uretici()
        {
            SeriUret sUret = new SeriUret();
            sUret.Uret();
        }
    }

Gördüğünüz gibi manuel bir vaziyette “SeriUret” yöntemiyle aracımız üretilmiştir.
Çalıştıralım…

        static void Main(string[] args)
        {
            Uretici uret = new Uretici();
            Console.Read();
        }

C# Strategy Design Pattern(Strateji Tasarım Deseni)
Peki! Şimdi işlemimizi “SeriUret” yöntemiyle değil “SiparisUzerineUret” isimli yöntemle gerçekleştirmek istiyorsam gidip “Uretici” sınıfının içeriğini aşağıdaki gibi değiştirmem lazım.

    class Uretici
    {
        public Uretici()
        {
            SiparisUzerineUret suUret = new SiparisUzerineUret();
            suUret.Uret();
        }
    }

Gördüğünüz gibi, ben ne zaman farklı bir yönteme geçmeye çalışsam bu “Uretici” sınıfını zırt pırt değiştirmekle mükellef olacağım için burada Strategy Design Pattern’i araya sokuyoruz.

“Strategy” isimli abstract classı(yahut interfacede olabilir) hazırlıyorum.

    abstract class Strategy
    {
        public abstract Opel Uret();
    }

Tüm yöntemlerimi bu soyut arayüzden türetiyorum.

    class SeriUret : Strategy
    {
        public override Opel Uret()
        {
            return new Opel("seri");
        }
    }
    class OzelYapimUret : Strategy
    {
        public override Opel Uret()
        {
            return new Opel("özel yapım");
        }
    }
    class SiparisUzerineUret : Strategy
    {
        public override Opel Uret()
        {
            return new Opel("sipariş üzerine");
        }
    }

“Uretici” sınıfını aşağıdaki gibi güncelliyorum.

    class Uretici
    {
        public Uretici(Strategy Yontem)
        {
            Yontem.Uret();
        }
    }

Dikkat ederseniz eğer “Uretici” sınıfının yani Context’imizin işi nasıl gerçekleştireceğiyle ilgisi kesilerek, yapılacak işlem Client’tan gönderilerek Strategy şablon tipinde elde edilerek işlenmektedir.

Kullanım olarak aşağıdaki kod bloğunu inceleyeniz.

        static void Main(string[] args)
        {
            OzelYapimUret oyUret = new OzelYapimUret();
            SeriUret sUret = new SeriUret();
            SiparisUzerineUret suUret = new SiparisUzerineUret();
            Uretici uret1 = new Uretici(oyUret);
            Uretici uret2 = new Uretici(sUret);
            Uretici uret3 = new Uretici(suUret);
            Console.Read();
        }

C# Strategy Design Pattern(Strateji Tasarım Deseni)

Bir Design Pattern makalesinin daha sonuna gelmiş bulunmaktayız…

Lakin, bitirmeden var olan bilgilerimizi örgütlemek maksatlı bir hatırlatmada bulunmak maksadıyla, Strategy Design Pattern’i uygularken Dependency Injection yaklaşımını sergilediğimize dikkat ettiniz mi? merak ediyorum doğrusu…

İsterseniz birde o gözle yapılan işlemleri tekrardan inceleyiniz… 🙂

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. 01 Temmuz 2016

    […] değişmektedir. O yüzden Template Method Design Pattern’i tercih etmekteyiz, aksi taktirde Strategy Design Pattern‘i ile durumu değerlendiriyor […]

  2. 13 Eylül 2021

    […] Strategy Design Pattern […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir