C#'ta Strategy Design Pattern

C#'ta Strategy Design Pattern kullanımı

Strategy Design Pattern, Behavioral Patterns gurubunda yer almaktadır. Hatırlayacağınız gibi Behavioral Patterns gurubu belirli bir işi yerine getirmek için çeşitli sınıfların nasıl birlikte davranış göstereceğini belirleyen desenlerden oluşuyordu.

Genelde bir işlem ve bu işlemin bir yapılış şekli vardır.

İhtiyaçlar sonucu bir yapılış şekli birden fazla ve değişken bir yapıda olabilir.

Yapılış şeklinin seçim kararı tasarım zamanı (design time) yada çalışma zamanı (run time) da veriliyor olabilir.

Strategy Design Pattern: Bir işlemin birden fazla yapılış şekli ve bu yapılış şekillerinin seçim kararı ve bunların uygulama sırasındaki davranışları konusunu işleyen tasarım desenidir.

Konuyu örneklendirirsek, bir mektup yazdınız ve bunu göndereceksiniz.

İşlemimiz:

  • Mektubu PTT ile göndermek. Bir yapılış şekli
  • Normal hizmet tarifesinden adrese gönder.(ucuz ve uzun süren bir işlem) Birden fazla yapılış şekli
  • Acil gitmesi gerektiği durumda (APS İadeli Taahhütlü Gönderi) ile gönder. (pahalı ve kısa süren bir işlem) Alıcının internet erişimi varsa Elektronik Posta ile gönder. (ucuz ve en kısa süren bir işlem) gibi... bir çok seçenek.
  • Yapılış şekli seçim kararının verilmesi. Design Time
  • Mektubu yazdınız normal hizmet tarifesi üzerinden göndermek kararı aldınız ve yola çıktınız. Run Time
  • Yola çıktıktan sonra telefon geldi ve konunun acil olduğunu en kısa sürede ulaşması gerektiği alıca tarafından size söylendi.

Seçim Kararı

Telefonda alıcıya internet erişimi ve eposta adresi olup olunmandığı soruldu. Alıcı hesabı olmadığını belirtti.

APS ile göndermeye karar verdiniz.

Context: İçerik nesnemiz. İstediği ConcreteStrategy tipini seçerek kullanabiliyor.

ConcreteStrategy: Birden fazla yapılış şekli. Örneğimizde postamızı gönderebileceğimiz farklı kanallar.

Strategy: ConcreteStrategy yapıları için ortak bir şablon sunan Abstract Class yada Interface'lerdir.

İleride oluşacak farklı gönderim kanalları bu yapı uygulanarak geliştirilecek ve kullanacaktır.

namespace ConsoleApplication1

{

abstract class Strategy

{

public abstract void Send(string NameSurname, string Address, string Telephone);

}


class Context

{

private Strategy _strategy;


public string NameSurname { get; set; } public string Address { get; set; } public string Telephone { get; set; }


public Context(Strategy strategy)

{

this._strategy = strategy;

}

public void Send()

{

_strategy.Send(NameSurname, Address, Telephone);

}

}


class ConcreteStrategy1 : Strategy

{

public override void Send(string NameSurname, string Address, string Telephone)

{

Console.WriteLine("Normal Hizmet Tarifesi üzerinden gönderildi.");

}

}


class ConcreteStrategy2 : Strategy

{

public override void Send(string NameSurname, string Address, string Telephone)

{

Console.WriteLine("APS İadeli Taahhütlü Gönderi tarifesi üzerinden gönderildi.");

}

}


class ConcreteStrategy3 : Strategy

{

public override void Send(string NameSurname, string Address, string Telephone)

{

Console.WriteLine("Elektronik Posta ile gönderildi.");

}

}


class Program

{

static void Main()

{

Context context;


// Normal hizmet tarifesi üzerinden göndermek üzere yola

çıktık.

context = new Context(new ConcreteStrategy1());


bool isReceivePhoneCalls = true; bool isExistAccount = false;


if (isReceivePhoneCalls == true) // Çağrı geldi

{

if (isExistAccount == false) // İnternet hesabı yoksa ? context = new Context(new ConcreteStrategy2()); // APS

else

context = new Context(new ConcreteStrategy3());//

EPOSTA

}


//Alıcı bilgilerini dolduruyp yolluyoruz. context.NameSurname = "Cin Ali"; context.Address = "İstanbul"; context.Telephone = "212-9999999"; context.Send();


Console.ReadLine();

}

}

}

 

Ozan Dalbudak
Merhaba,1995 doğumluyum. 2009 yılında lisede veritabanı Programcılığı bölümünü kazanarak kariyerime başlamış oldum. Daha sonra Selçuk Üniversitesi'nde Bilgisayar Mühendisliği okuyorum.
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git