Sorumluluk Zinciri
Bu tasarım deseni, bir dizi işlev sınıflarıyla, bu sınıfların işlevlerini başlatmak için gereken komut sınıflarından oluşur. İşlev sınıfları, ne tür işler yapacağını kendi bünyesinde tutar, ayrıca dizideki diğer bir işlev sınıfının ne olacağını da belirler. Bir işlemin, belli miktarda işlevlerden sırayla geçmesi gerektiğinde bu tasarım deseni kullanılabilir.
Örnek :
İşlev soyut sınıfının alt sınıfları olan İşlevA, İşlevB ve İşlevC sınıflarını zincirdeki tek bir işi yerine getiren zincirin halkaları olarak yorumlayabiliriz. Bu sınflardaki, "işleviYerineGetir" yordamı çağırılarak ilgili işlev yapılır. Bu yordam yapılacak zincirin nerede kullanılacağına bağlı olarak n tane değiştirge alabilir. Bu örnekte işlemVerisi isminde tek bir tane almıştır. İşlev sınıfındaki "sonrakiniAyarla" yordamı, zincirin bir halkasından sonra hangisinin geleceğini belirler. "çalıştır" yordamı ise, zincirin halkalarının sırayla çağrılmasını sağlayan yordamdır. Örnekteki, ZincirSınaması sınıfı, sistemi deneyen istemci sınıftır. Bu sınıfta örnek olarak iki tane zincir oluşturulup çalıştırılmıştır.
Örnek Sınıf Çizelgesi :
Örnek Java Kodu : ( Kodlar java 1.6.0.7 ile derlenip, çalıştırılmıştır. )
İşlev.java :
public abstract class İşlev {
protected İşlev sonrakiİşlev;
protected İşlev sonrakiniAyarla( İşlev sonraki ) {
sonrakiİşlev = sonraki;
return sonraki;
}
protected void çalıştır( String işlemVerisi ) {
// İşlevi yerine getir.
işleviYerineGetir( işlemVerisi );
// Sonraki işlev boş değilse, ona geç.
if ( sonrakiİşlev != null ) {
sonrakiİşlev.çalıştır( işlemVerisi );
}
}
protected abstract void işleviYerineGetir(
String işlemVerisi );
}
İşlevA.java :
public class İşlevA extends İşlev {
@Override
protected void işleviYerineGetir( String işlemVerisi ) {
System.out.println( "İşlev A yapıldı. Veri: "
+ işlemVerisi );
}
}
İşlevB.java :
public class İşlevB extends İşlev {
@Override
protected void işleviYerineGetir( String işlemVerisi ) {
System.out.println( "İşlev B yapıldı. Veri: "
+ işlemVerisi );
}
}
İşlevC.java :
public class İşlevC extends İşlev {
@Override
protected void işleviYerineGetir( String işlemVerisi ) {
System.out.println( "İşlev C yapıldı. Veri: "
+ işlemVerisi );
}
}
ZincirSınaması.java :
public class ZincirSınaması {
public static void main(String[] args) {
// Zincir nesneleri.
İşlev zincir1, zincir2, zincir;
// Zincir 1 i oluştur. A -> C -> B
zincir1 = new İşlevA();
zincir = zincir1.sonrakiniAyarla( new İşlevC() );
zincir = zincir.sonrakiniAyarla( new İşlevB() );
// Zincir 2 yi oluştur. C -> A
zincir2 = new İşlevC();
zincir2.sonrakiniAyarla( new İşlevA() );
// Zincir 1 i çalıştır.
zincir1.çalıştır( "Veri1" );
// Zincir 2 yi çalıştır.
zincir2.çalıştır( "Veri2" );
}
}