The Chain of Responsibility Pattern

Selamlar,

The Chain of Responsibility Pattern, sorumluluk zinciri adı ile de bilinen Behavioral yani nesneler arasındaki bağlantıyı ayarlayan design patterin kategorisindeki  bir tasarım desenidir.  Güncel hayatımızda çokça karşımıza çıkmaktadır.

CoR bir amaca yönelik bir dizi işlemi gerçekleştiren nesnelerin birbirlerinden bağımsız bir şekilde çalışmasını ve her bir nesnenin sadece kendisine tanımlı işleri yapmasını sağlayan bir design patterindır. Sorumluluk zinciri ismi de burdan gelmektedir. Bu nesneler arasındaki tek bağlantı mesaj(request) yapısıdır. Bütün nesneler bu mesaj yapısını kullanarak işlerini gerçekleştirir. Bu nesneler, çalışma yapısı olarak aynı işi yapmalarına rağmen birbirlerinden haberdar olmamaları loosly coupled (gevşek bağlı) nesneler olarak anılmalarına sebep olmaktadır. CoR deseni daha çok bolca if-else blokları geçen yerlerde kullanılmalıdır. Yoksa belli bir süre sonra kodlar kontrolden çıkabilir.

chain

Bügünkü örneğimizde bir dergideki yazının onaylanmasını konu alacağız. Sözde yazı 1000 karakterden az ise Editor (A). 1000 ile 2000 karakter arasında ise Executive Editor(B). Eğer 2000 karakterden fazla ise Managing Editor(C) tarafından onaylanması gerekmektedir.

Öncelikle onaylanacak document’ı tanımlayalım. Aşağıda görüldüğü gibi onaylanacak yazı TextContent bir de  yazı Id’si bulunmktadır.

Documnet.cs:

Şimdi ReviewResult denen yazının onaylanması sonucu dönen class’ı tanımlayalım. Aşağıda görüldüğü gibi onaylanma sonucu Approved ve onaylayan kişinin title’ının belirtildiği Reviewer  propertyleri tanımlanmıştır.

ReviewResult.cs:

Tüm editor tiplerinin yaratıldığı IEditor interface class’ı aşağıda tanımlanmıştır. Aşağıda görüldüğü gibi tüm editor’lerin işi ortaktır. Hepsi yazıları onaylarlar. Yani ReviewDocument methoduna, onaylanacak document parametresini alarak ReviewResult class’ı sonucunu döndürürler.

IEditor.cs:

Aşağıda Editor classını görmekteyiz. Constractor’da tanımlanan Successor işte bahsettiğimiz relation’ın ta kendisidir.Yani bağlı olduğu üstüdür. ReviewDocument yani onaylama işleminde eğer onaylama sorumluluğu kendisinde değilse bir üstüne ilgili document’i havale eder. Aşağıda görüldüğü gibi gelen document‘ı TextContent‘i 1000 karakterden fazla ise bir üstü olan Executive Editor’e onaylanması için göndermektedir. Böylece aynı işi yapan birbirinden habersiz 2 class Successor property’si ile kendi aralarındaki relation’ı kurmuş olurlar . Eğer değilse kendi onaylama işlemini yapıp ReviewResult class’ını döndürmektedir. Eğer gelen document’ın TextContent’i 600’den küçük ise rejected olmaktadır. Title yani Reviewer‘ı Editor‘dür.

 Editor.cs:

Aşağıda görüldüğü gibi yine bağlı olduğu üst editor Successor ile constractor’da tanımlanmıştır. Onaylama yani ReviewDocument işleminde ilgili document‘ı 2000 karakterden fazla ise bir üst’ü olan Managing Editor‘e göndermektedir. Eğer değilse kendi onaylama işlemini yapıp ReviewResult class’ını döndürmektedir. Gelen document‘ın TextContent‘i 1500’den küçük ise rejected olmaktadır. Title yani Reviewer‘ı Executive Editor‘dür.

 ExecutiveEditor.cs :

Aşağıda görüldüğü gibi editörlerin en üst class’ı ManagingEditor‘dür. Çünkü kendisinin Successor property’si yani üsttü yoktur. Eğer bu editöre bir document geliyor ise onaylanması için TextContent‘i 2000’den fazla olmalıdır. Title yani Reviewer‘ı Managing Editor‘dür.

 ManagingEditor.cs: 

Aşağıda görüldüğü gibi 4 farklı document onaylanmak için gönderilmiştir. Herbiri için onaylama işlemi yapıcak editor aşağıdaki gibi iç içe tanımlı IEditor class’ları ile tanımlanmıştır. Her editor’ün constractor‘unda bir üst editor‘ü tanımlanmıştır.

star

 IEditor editor = new Editor(new ExecutiveEditor(new ManagingEditor()));

TextContent’i 1000 den küçük olan ilk 2 document Editor tarafından onaylanmıştır. Ama ilk document’ın TextContent’i 600’den küçük olduğu için rejected olmuştur. TextContent’i 1500 olan 3. document ExecutiveEditor tarafından rejected olmuştur. Son document 2500 karakterdir. Ve ManagingEditor tarafından onaylanmıştır.

Program.cs:

 Sonuç Ekranı:

result

Böylece belli bir amaca yönelik bir dizi işlemin gerçekleştiği durumlarda birbirinden bağımsız çalışan nesnelerin, mesaj(request) ile nasıl birbirlerine bağlandıklarını ve sorumluluk zincirinde bireysel olarak nasıl çalıştıklarını gördük. Böylece belli bir sorumluluk silsilesinde Chain of Responsibility Pattern‘ın nekadar faydalı olduğunu birdaha görmüş olduk.

Yeni bir makalede buluşmak dileği ile hoşçakalın.

Source Code:http://www.borakasmer.com/projects/ChainOfCommandPatternDemo.rar

Herkes Görsün:

Sevebilirsin...

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir