Chain of Responsibility tasarım deseni behavioral(davranışsal) tasarım kalıbı grubundadır.
Bir işlemi yapabilecek birden fazla sınıftan hangisinin işlemi yapacağına karar verir.
Nesnelerin aynı görevde yer alması fakat birbirlerinden haberdar olmama durumunu (loosely coupled) temel alır.
İletilen ortak bir mesaj(request) vardır. İstemciden gelen bir talebin bunları işlemek için bir nesneler zincirine iletildir.
Daha sonra zincirdeki nesne, isteği kimin işleyeceğine ve isteğin zincirdeki bir sonraki nesneye gönderilip gönderilmediğine karar verecektir.
Loosely Coupled : Gevşek bağlantı, etkileşim ve bağımlılık en az düzeyde ve diğer sınıfın işine müdahale etmeden bağlıdırlar.
Handler : İstekleri işler. Talebi alacak ve zincire gönderecek abstract veya interfacedir.
Concrete Handlers : Sorumlu olduğu talebi değerlendirir ve işler. Değerlendirmede nesneyi işleyip işlemeyeceğine ve ayrıca zincir boyunca iletip iletemeyeceğine karar verir. Gerekirse talebi zincir içerisinde arkasından gelen nesneye iletir. Sonraki nesne ise client tarafında belirlenir.
Client : Zincirdeki bir ConcreteHandler nesnesine istek başlatır.
Örnek olarak, içine para atarak yiyecek veya içecek aldığımız otomatları verebiliriz.
Bir lira veya elli kuruş tanıyabilen otomat için CoR kullanılmış Java kodu.
public abstract class MetalPara {
private static ArrayList paraListesi = new ArrayList();
private static MetalPara next;
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public MetalPara getNext() {
return next;
}
public MetalPara setNext(MetalPara next) {
this.next = next;
return this;
}
public void check(MetalPara para) {
System.out.println("Siradaki nesne sadece " + this + " isleyebilir.");
if (para.getValue() != this.value) {
System.out.println("Zincirdeki bir " + "sonraki nesneye iletiyoruz.");
if (getNext() != null) {
getNext().check(para);
} else {
System.out.println("Zincirin sonundayiz. " + "Para " + para.toString() + " " + "uygun degil.");
}
} else {
paraListesi.add(para);
System.out.println("Otomat tarafindan " + this.toString() + " kabul edildi");
}
}
}
public class BirTl extends MetalPara {
public String toString() {
return "1 Lira";
}
public BirTl() {
setValue(100);
}
}
public class ElliKurus extends MetalPara {
public String toString() {
return "50 kurus";
}
public ElliKurus() {
setValue(50);
}
}
public class MetalParaAtma {
private static MetalPara zincir = null;
public static void main(String[] args) {
zincir = (new BirTl()).setNext((new ElliKurus()));
paraAt(new ElliKurus());
paraAt(new ElliKurus());
paraAt(new BirTl());
}
public static void paraAt(MetalPara para) {
System.out.println("Otomata " + para.toString() + " atildi.");
zincir.check(para);
}
}
0 Yorum