Chain of Responsibility desenini Java'da adım adım anlatayım ve örnek bir kod parçası ile açıklayayım.
Chain of Responsibility Deseninin Temel Fikri:
Chain of Responsibility, bir isteği (request) işlemek için bir nesneler zinciri oluşturur. İstek zincirdeki ilk nesneden başlar ve her nesne ya isteği işler ya da bir sonraki nesneye aktarır. Bu, isteğin hangi nesne tarafından işleneceğinin önceden belirlenmemiş olmasını sağlar.
Örnek Senaryo:
Diyelim ki bir uygulamada farklı türlerdeki log mesajlarını (hata, uyarı, bilgi) işlemek istiyorsunuz. Her bir mesaj türü için farklı bir işleyici (handler) tanımlayacaksınız ve bu işleyiciler bir zincir oluşturacak.
Handler Arayüzü Oluşturma:
Handler adında bir arayüz tanımlayın. Bu arayüzde, isteği işlemek için handleRequest ve bir sonraki handler'ı ayarlamak için setNext adında iki metot olmalıdır.
Konkret Handler Sınıfları Oluşturma:
ErrorHandler, WarningHandler, InfoHandler adında Handler arayüzünü uygulayan sınıflar oluşturun. Her biri, kendisine verilen mesajı işleyecek ve uygunsa bir sonraki handler'a aktaracak.
Zinciri Kurma:
Bu handler'ları bir zincirde sıralayın. Örneğin, ErrorHandler'ı ilk sıraya, sonra WarningHandler'ı ve en sona InfoHandler'ı koyun.
Java ile Uygulama:
İşte bu tasarım deseninin basit bir uygulaması:
java
Copy code
interface Handler {
void setNext(Handler handler);
void handleRequest(String message);
}
class ErrorHandler implements Handler {
private Handler next;
@Override
public void setNext(Handler handler) {
this.next = handler;
}
@Override
public void handleRequest(String message) {
if (message.contains("Error")) {
System.out.println("Error Handler: " + message);
}
if (next != null) {
next.handleRequest(message);
}
}
}
class WarningHandler implements Handler {
private Handler next;
@Override
public void setNext(Handler handler) {
this.next = handler;
}
@Override
public void handleRequest(String message) {
if (message.contains("Warning")) {
System.out.println("Warning Handler: " + message);
}
if (next != null) {
next.handleRequest(message);
}
}
}
class InfoHandler implements Handler {
private Handler next;
@Override
public void setNext(Handler handler) {
this.next = handler;
}
@Override
public void handleRequest(String message) {
if (message.contains("Info")) {
System.out.println("Info Handler: " + message);
}
if (next != null) {
next.handleRequest(message);
}
}
}
public class Client {
public static void main(String[] args) {
Handler errorHandler = new ErrorHandler();
Handler warningHandler = new WarningHandler();
Handler infoHandler = new InfoHandler();
errorHandler.setNext(warningHandler);
warningHandler.setNext(infoHandler);
errorHandler.handleRequest("Error: Bu bir hata mesajıdır.");
errorHandler.handleRequest("Warning: Bu bir uyarı mesajıdır.");
errorHandler.handleRequest("Info: Bu bir bilgi mesajıdır.");
}
}
Bu kodda, ErrorHandler, WarningHandler ve InfoHandler sınıfları belirli türdeki mesajları işler ve gerektiğinde zincirdeki bir sonraki handler'a mesajı aktarır. Client sınıfı ise zinciri kurar ve test mesajlarını gönderir.