Chain of Responsibility Pattern (Sorumluluk Zinciri Tasarım Kalıbı), bir isteğin belirli bir işlem sırası içinde yönlendirilmesini sağlayan bir davranışsal tasarım desenidir. Bu desen, bir isteğin hangi bileşen tarafından ele alınacağını dinamik olarak belirler ve isteği işleyebilecek olan bir sonraki işlemcinin (handler) devreye girmesine izin verir.
Ne Zaman Kullanılmalıdır?
Chain of Responsibility Pattern şu durumlarda kullanışlıdır:
- İsteklerin belirli bir işlem sırası içinde işlenmesi gerektiğinde.
- İşlemi gerçekleştirecek nesnenin, çalışma zamanında belirlenmesi gerektiğinde.
- İstekleri yöneten bileşenlerin birbirinden bağımsız olması gerektiğinde.
- Kodun esnek ve genişletilebilir olması için, yeni işlemciler eklenebilmesi gerektiğinde.
Chain of Responsibility Pattern’in Avantajları ve Dezavantajları
Avantajlar:
- İsteklerin esnek bir şekilde yönetilmesini sağlar.
- İşlemciler arasında bağımsızlık oluşturur, sıkı bağımlılığı azaltır.
- Yeni işlemciler eklemek veya çıkarmak kolaydır.
Dezavantajlar:
- İsteklerin yanlış yönlendirilmesi durumunda döngüsel bir yapı oluşabilir.
- İsteklerin işlendiği işlemciyi belirlemek zor olabilir.
- Eğer zincir çok uzunsa, performans açısından maliyetli olabilir.
Chain of Responsibility Pattern Kullanım Biçimleri
1. Handler Arayüzü ve Concrete Handler Sınıfları
// Handler Arayüzü
abstract class Handler {
protected Handler nextHandler;
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handleRequest(int request);
}
// Concrete Handler: Küçük İstekleri İşleyen Sınıf
class SmallRequestHandler extends Handler {
@Override
public void handleRequest(int request) {
if (request <= 10) {
System.out.println("Küçük İstek İşlendi: " + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
// Concrete Handler: Orta Büyüklükteki İstekleri İşleyen Sınıf
class MediumRequestHandler extends Handler {
@Override
public void handleRequest(int request) {
if (request > 10 && request <= 50) {
System.out.println("Orta Büyüklükteki İstek İşlendi: " + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
// Concrete Handler: Büyük İstekleri İşleyen Sınıf
class LargeRequestHandler extends Handler {
@Override
public void handleRequest(int request) {
if (request > 50) {
System.out.println("Büyük İstek İşlendi: " + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
2. Kullanım
public class Main {
public static void main(String[] args) {
Handler smallHandler = new SmallRequestHandler();
Handler mediumHandler = new MediumRequestHandler();
Handler largeHandler = new LargeRequestHandler();
smallHandler.setNextHandler(mediumHandler);
mediumHandler.setNextHandler(largeHandler);
smallHandler.handleRequest(5);
smallHandler.handleRequest(20);
smallHandler.handleRequest(100);
}
}
Çıktı:
Küçük İstek İşlendi: 5
Orta Büyüklükteki İstek İşlendi: 20
Büyük İstek İşlendi: 100
Gerçek Dünya Senaryosu: Müşteri Destek Sistemi
// Handler Arayüzü
abstract class SupportHandler {
protected SupportHandler nextHandler;
public void setNextHandler(SupportHandler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handleRequest(String issue);
}
// Concrete Handler: Temel Destek
class BasicSupport extends SupportHandler {
@Override
public void handleRequest(String issue) {
if (issue.equals("Şifre Sıfırlama")) {
System.out.println("Temel Destek: Şifre sıfırlama işlemi yapıldı.");
} else if (nextHandler != null) {
nextHandler.handleRequest(issue);
}
}
}
// Concrete Handler: Teknik Destek
class TechnicalSupport extends SupportHandler {
@Override
public void handleRequest(String issue) {
if (issue.equals("Bağlantı Sorunu")) {
System.out.println("Teknik Destek: Bağlantı problemi çözüldü.");
} else if (nextHandler != null) {
nextHandler.handleRequest(issue);
}
}
}
// Concrete Handler: Üst Seviye Destek
class AdvancedSupport extends SupportHandler {
@Override
public void handleRequest(String issue) {
System.out.println("Üst Seviye Destek: " + issue + " ile ilgili uzman ekibimiz ilgileniyor.");
}
}
Kullanım
public class Main {
public static void main(String[] args) {
SupportHandler basic = new BasicSupport();
SupportHandler technical = new TechnicalSupport();
SupportHandler advanced = new AdvancedSupport();
basic.setNextHandler(technical);
technical.setNextHandler(advanced);
basic.handleRequest("Şifre Sıfırlama");
basic.handleRequest("Bağlantı Sorunu");
basic.handleRequest("Sunucu Çökmesi");
}
}
Çıktı:
Temel Destek: Şifre sıfırlama işlemi yapıldı.
Teknik Destek: Bağlantı problemi çözüldü.
Üst Seviye Destek: Sunucu Çökmesi ile ilgili uzman ekibimiz ilgileniyor.
Sonuç
Chain of Responsibility Pattern, isteklerin belirli bir işlem sırası içinde yönlendirilmesini ve gerektiğinde bir sonraki işlemciye aktarılmasını sağlar. Gerçek dünyada şu senaryolarda yaygın olarak kullanılır:
- Müşteri destek sistemleri (Seviyeli destek ekipleri)
- Yetkilendirme sistemleri (Kullanıcı yetkileri doğrultusunda işlemler)
- İstek filtreleme ve işlem kuyruğu yönetimi
- Güvenlik kontrolleri (İsteklerin seviyeye göre değerlendirilmesi)
Chain of Responsibility Pattern sayesinde, işlemleri yöneten bileşenler birbirine sıkı bağlı olmadan yönetilebilir ve sistem esnek hale gelir. 🚀