Chain of Responsibility (Sorumluluk Zinciri)

Chain of Responsibility kod karmaşasını önlemek amacıyla oluşturulmuştur. Bir işlemi yapabilecek birden fazla sınıftan hangisinin yapacağına karar veren tasarım desenidir. Projelerimizde birden fazla koşullu metotlar yazmak istediğimizde her koşul için if else blokları açılır ve ilgili metotlar çalıştırılmaktadır.Aşağıdaki örnekte buna benzer bir yapı oluşturmaya çalıştım. Bu yapıyı if else blokları yerine chain of responsbility ( sorumluluk zinciri ) tasarım desenini kullanacağım. Bu tasarım deseninde 3 ana yapı vardır.

Handler : Kendisinden türeyecek ConcreteHandler’ ların, işleyebilmesi için gerekli olan arayüzdür. Abstract class yada Interface şeklinde tanımlanabilir.

ConcreteHandler : Gelen isteğe cevap verebilecek gerekirse isteği kendisinden sonra gelen nesneye iletir.

Client : Zinciri oluşturan ve zincirin ilk halkasına isteği gönderen nesnedir.

Aşağıdaki örnekte spor alanlarını Enum tipleri olarak tanımladım. Bu tiplere göre oluşturacağım desene spor tipleri gönderilecek ve ilgili sınıflar çalışacaktır. Uygulamada Handler yapısı SporHandler abstract sınıf olarak tanımlandı. Bu sınıfı _SporHandler property ile kendisine gönderen Enum tipinde SporTipleri parametresini alan abstract metodunu ekliyorum. Handler yapısından türeyen ConcreteHandler sınıflarını yazıyorum. Bu sınıflar SporHandler den talep edilen istekleri Sporcu metoduyla override edip işlemi yapıyoruz yada _NextHandler ile sıradaki nesneye gönderiyoruz. Uygulamaya buradan erişebilirsiniz.

using System;
namespace Chain_of_Responsibility
{
public abstract class SporHandler
{
protected SporHandler _NextHandler;
public SporHandler NextHandler { set { _NextHandler = value; } }
        public abstract void Sporcu(SporTipleri tip);
}

    public class ConcreteHandlerFutbol : SporHandler
{
public override void Sporcu(SporTipleri tip)
{
if (tip == SporTipleri.Futbol)
{
Console.WriteLine("Spor Tipi : {0}", tip.ToString());
}
else
{
if (_NextHandler != null)
{
_NextHandler.Sporcu(tip);
}
}
}
}
    public class ConcreteHandlerBasketbol : SporHandler
{
public override void Sporcu(SporTipleri tip)
{
if (tip == SporTipleri.Basketbol)
{
Console.WriteLine("Spor Tipi : {0}", tip.ToString());
}
else
{
if (_NextHandler != null)
{
_NextHandler.Sporcu(tip);
}
}
}
}
    public class ConcreteHandlerTenis : SporHandler
{
public override void Sporcu(SporTipleri tip)
{
if (tip == SporTipleri.Tenis)
{
Console.WriteLine("Spor Tipi : {0}", tip.ToString());
}
else
{
if (_NextHandler != null)
{
_NextHandler.Sporcu(tip);
}
}
}
}
    public enum SporTipleri
{
Futbol,
Basketbol,
Tenis,
}
}
using System;
namespace Chain_of_Responsibility
{
class Program
{
static void Main(string[] args)
{
SporHandler futbol = new ConcreteHandlerFutbol();
SporHandler basketbol = new ConcreteHandlerBasketbol();
SporHandler tenis = new ConcreteHandlerTenis();
            futbol.NextHandler = basketbol;
basketbol.NextHandler = tenis;
tenis.NextHandler = futbol;
            futbol.Sporcu(SporTipleri.Basketbol);
futbol.Sporcu(SporTipleri.Futbol);
futbol.Sporcu(SporTipleri.Tenis);
            Console.ReadLine();
}
}

}