Skip to content

Strategy Design Pattern

Bu pattern aynı işin farklı yöntemler (algoritmalar) ile yapılacağı durumlarda kullanılır.

Elimizde bir Kullanici sınıfı olsun. Kullanıcıların da admin ve normal kullanıcı şeklinde iki farklı tipi olsun. Bu kullanıcıların sistemde ulaşabilecekleri menüler için yetkilendirilmeleri farklı şekillerde olur. Aslında hiç desen kullanmadan bu işi switch case ile halledebiliriz. Lakin yetkilendirme işlemi bu şekilde Kullanıcı sınıfına aşırı derecede bağımlı olacağından ilerleyen süreçte değişiklik gerektiğinde veya yeni bir kullanıcı tipi geldiğinde düzenlemeler oldukça karmaşık bir hal alacaktır. Üstelik kodların yeniden kullanılabilirliği de düşecektir. Bu yüzden bu işi strategy pattern’ı ile yapıyoruz.

Aşağıdaki örnek C# ile hazırlandı.

Yapılan işlem tip ne olursa olsun yetkilendirme işlemi olacağından, tüm stratejileri bağlayacak bir kontrat oluşturmamız gerekir. Bunu da bir interface aracılığı ile yapabiliriz.

[cc lang=”csharp”]

public interface IAuthStrategy
{
ArrayList authorize();
}

[/cc]

Şimdi sırada tüm kullanıcı tipleri için bu interface’in implemantasyonu var.

[cc lang=”csharp”]

public class NormalAuth : IAuthStrategy
{

public override ArrayList authorize()
{
ArrayList yetkiler = new ArrayList();
yetkiler.AddRange(new bool[] { false, true, false });

return yetkiler;
}
}

[/cc]

Bizim sistemimizde üç adet menü var bu üçü için normal kullanıcının görüp görememesini boolean değerler ile belirttik. Tabi ki bu yetkilendirme implementasyonu daha da esnek bir hale getirilebilir ama konunun rahat anlaşılması açısından mümkün olduğu kadar sade halini koyuyorum.

Aynı şekilde admin kullanıcı için de implementasyonu yapıyoruz.

[cc lang=”csharp”]

public class AdminAuth : IAuthStrategy
{

public override ArrayList authorize()
{
ArrayList yetkiler = new ArrayList();
yetkiler.AddRange(new bool[] { true, true, true });

return yetkiler;
}
}
[/cc]


Admin kullanıcısının da tüm menüleri görmesini sağladık. Kullanıcı sınıfı ile yetkilendirme işleminin esnek bağlı olmasını istediğimizi söylemiştik. Şimdi bu esnek bağı kuralım.

[cc lang=”csharp”]
public Kullanici(int kullaniciNo, string ad, string soyad, string sifre, int yetki)
{
//burada diğer atamalar mevcut
this.yetki = yetki;
this.YetkiStratejisi = AuthStrategyFactory.createAuthStrategy(yetki);

}
[/cc]

Yukarıda Kullanıcı sınıfının yapıcı metodunu görebilirsiniz. Bu metot içinde veritabanından çektiğimiz yetki değerine göre fabrikamızdan(Factory Pattern’ı daha sonra açıklayacağım ama şimdilik bir strateji nesnesi döndürdüğünü bilseniz yeterli) bir strategy oluşturup IAuthStrategy tipindeki referansımıza atıyoruz. Burada IAuthStrategy interface’i üst tip görevi gördüğünden polimorfik olarak bütün stratejilerimizin nesnelerini tutabiliyor. Böylece esnek bağı sağlamış olduk. Şimdi bir yetkilendirme metodu ile stratejimizin içindeki metodu çağıralım. Kullanıcı sınıfı içinde şöyle bir metodumuz olsun:

[cc lang=”csharp”]
public ArrayList yetkileriBelirle()
{
return this.YetkiStratejisi.authorize();
}
[/cc]

Bu metod ile o kullanıcı için polimorfik olarak atanan strateji ne ise onun içindeki authorize metodu çağırılıyor ve uygun ArrayList döndürülerek yetkilendirme yapılıyor.

Sorularınızı yorumlar aracılığı ile sorabilirsiniz.

Published inJavaNYP

Be First to Comment

Leave a Reply