Chain of Responsibility (Sorumluluk Zinciri)

Murat Süzen
Sep 20, 2016 · 2 min read

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();
}
}

}
Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade