C#'ta Chain of Responsibility Pattern

C#'ta Chain of Responsibility Patternin kullanımını görelim.

Chain of Responsibility: Behavioral Patterns gurubu içerisinde yer alır. Sorumluluk Zinciri anlamına gelir. İstemcinin gönderdiği mesaj veya isteğin sanal bir zincir üzerinde gezdirilmesi ve işlemin icrası konusunda asıl sorumlu olan zincir halkasının ilgili işleri yapması olarak tanımlanabilir. Bu zincirin her bir halkası bir nesne olarak temsil edilir ve tümü birbirinden bağımsız bir şekilde çalışabilir. Birbirlerine Zayıf bir şekilde (Loosly Coupled) bağlıdırlar. Zincir halkaları gelen istekleri işlemek ve cevap vermek zorundadır. Zincirde yer alan tüm zincir halkaları (işleyiciler) ayrı bir sorumluluğa sahiptir. Zincire bırakılan tüm mesaj yada istek zincirin tüm halkaları tarafından işlenebilir ve diğer halkalara yönlendirilebilir.

 

Handler: Abstract Class veya Interface olarak tasarlanacak. İşleyici nesenlerin (zincir halkalarının) şablonunu oluşturacak

ConcreteHandler: Handler arayüzünü uygulayan İşleyici nesneler. (Zincirin asıl halkaları)

Client: İstemci Uygulama

Successor: Zincirdeki bir sonraki halkayı temsil ediyor.

İstemcinin gönderdiği talep işleyici zincir halkaları tarafından değerlendirilir. Eğer talep işlem gören zincir halkasının sorumluluk alanında ise talebi gerçekleştirir. Eğer sorumluluk alanında değilse bir sonraki üst zincir halkasına talebi gönderir. İşlem aşaması talebin sorumlu olduğu zincire ulaşması ve işlemin sonlanmasına kadar devam eder.

Pattern kullanım alanı konusunda verilebilecek örnekler: Exception yapıları, Loglama, Mail spam filtreleri, HttpHandler yapısı.

Biz örneğimizde bir satın alma işleminde ödeme yetkisini konu ile ilişkilendirmeye çalışacağız.

  • Memur: 1000 TL (max)
  • Şef: 5000 TL (max)
  • Müdür: Sınırsız

Yetkili olmaları durumunda ödeyebilecekleri tutarlar yukarıdaki gibidir.
 

namespace ConsoleApplication1

{

// Handler

abstract class CORHandler

{

protected CORHandler successor;


public void Successor(CORHandler successor)

{

this.successor = successor;

}


public abstract void Istek(OdemeYetkisi odemeYetkisi);

}


//  ConcreteHandler class Memur : CORHandler

{

public override void Istek(OdemeYetkisi odemeYetkisi)

{

if (odemeYetkisi.Yetki == true && odemeYetkisi.Miktar < 1000)

{

Console.WriteLine("{0} Ödeme onaylandı.", this.GetType().Name);

}

else if (successor != null)

{

successor.Istek(odemeYetkisi);

}

}

}


// ConcreteHandler class Sef : CORHandler

{

public override void Istek(OdemeYetkisi odemeYetkisi)

{

if (odemeYetkisi.Yetki == true && odemeYetkisi.Miktar < 5000)

{

Console.WriteLine("{0} Ödeme onaylandı.", this.GetType().Name);

}

else if (successor != null)

{

successor.Istek(odemeYetkisi);

}

}

}


//  ConcreteHandler class Mudur : CORHandler

{

public override void Istek(OdemeYetkisi odemeYetkisi)

{

if (odemeYetkisi.Yetki == true)

{

Console.WriteLine("{0} Ödeme onaylandı.", this.GetType().Name);

}

else if (successor != null)

{

successor.Istek(odemeYetkisi);

}

}

}


class OdemeYetkisi

{

public int Miktar { get; set; } public bool Yetki { get; set; }

}


class Program

{

static void Main()

{

CORHandler memur = new Memur(); CORHandler sef = new Sef(); CORHandler mudur = new Mudur();


memur.Successor(sef); sef.Successor(mudur);




= true };

OdemeYetkisi odeme = new OdemeYetkisi() { Miktar = 800, Yetki memur.Istek(odeme);


odeme = new OdemeYetkisi() { Miktar = 4000, Yetki = true }; memur.Istek(odeme);


odeme = new OdemeYetkisi() { Miktar = 2000, Yetki = true }; sef.Istek(odeme);


odeme = new OdemeYetkisi() { Miktar = 6000, Yetki = true }; sef.Istek(odeme);


odeme = new OdemeYetkisi() { Miktar = 10000, Yetki = true }; mudur.Istek(odeme);


Console.ReadKey();

}

}

}

Ekran Çıktısı:

  • Memur Ödeme onaylandı. Sef Ödeme onaylandı.
  • Sef Ödeme onaylandı. Mudur Ödeme onaylandı. Mudur Ödeme onaylandı.

 

Yorum Yaz

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

Yukarı Git