┌────────────────────────────────────────┐ │ <<abstract>> │ │ Handler │ ← Abstract Handler ├────────────────────────────────────────┤ │ - nextHandler: Handler │ │ + setNextHandler(Handler): void │ │ + handleRequest(SupportRequest): void │ │ # canHandle(SupportRequest): boolean │ │ # processRequest(SupportRequest): void │ └────────────────────────────────────────┘ △ │ extends │ ┌────────────────────┬─────────────────────┬───────────────────┐ │ FirstLevelHandler │ SecondLevelHandler │ ThirdLevelHandler │ ← Concrete Handlers ├────────────────────┼─────────────────────┼───────────────────┤ │+ canHandle() │+ canHandle() │+ canHandle() │ │+ processRequest() │+ processRequest() │+ processRequest() │ └────────────────────┴─────────────────────┴───────────────────┘ ┌───────────────────────────────┐ │ SupportRequest │ ← Request ├───────────────────────────────┤ │ - message: String │ │ - severity: int │ │ + SupportRequest(String, int) │ │ + getMessage(): String │ │ + getSeverity(): int │ └───────────────────────────────┘
Request Object
:public class SupportRequest { private String message; private int severity; public SupportRequest(String message, int severity) { this.message = message; this.severity = severity; } public String getMessage() { return message; } public int getSeverity() { return severity; } }
Abstract Handler
:public abstract class Handler { private Handler nextHandler; public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } public void handleRequest(SupportRequest request) { if (canHandle(request)) { processRequest(request); } else if (nextHandler != null) { nextHandler.handleRequest(request); } else { System.out.println("No handler available for request: " + request.getMessage()); } } protected abstract boolean canHandle(SupportRequest request); protected abstract void processRequest(SupportRequest request); }
Concrete Handlers
:public class FirstLevelHandler extends Handler { @Override protected boolean canHandle(SupportRequest request) { return request.getSeverity() == 1; } @Override protected void processRequest(SupportRequest request) { System.out.println("FirstLevelHandler processed: " + request.getMessage()); } }Second Level Handler:
public class SecondLevelHandler extends Handler { @Override protected boolean canHandle(SupportRequest request) { return request.getSeverity() == 2; } @Override protected void processRequest(SupportRequest request) { System.out.println("SecondLevelHandler processed: " + request.getMessage()); } }Third Level Handler:
public class ThirdLevelHandler extends Handler { @Override protected boolean canHandle(SupportRequest request) { return request.getSeverity() > 2; } @Override protected void processRequest(SupportRequest request) { System.out.println("ThirdLevelHandler processed: " + request.getMessage()); } }
public class ChainOfResponsibilityPatternTest { public static void main(String[] args) { // Create handlers Handler firstLevelHandler = new FirstLevelHandler(); Handler secondLevelHandler = new SecondLevelHandler(); Handler thirdLevelHandler = new ThirdLevelHandler(); // Set up the chain firstLevelHandler.setNextHandler(secondLevelHandler); secondLevelHandler.setNextHandler(thirdLevelHandler); // Create different requests SupportRequest request1 = new SupportRequest("Password reset issue", 1); SupportRequest request2 = new SupportRequest("Software installation problem", 2); SupportRequest request3 = new SupportRequest("Critical system outage", 3); System.out.println("Processing Support Requests"); // Process requests through the chain firstLevelHandler.handleRequest(request1); firstLevelHandler.handleRequest(request2); firstLevelHandler.handleRequest(request3); } }