Chain of Responsibility Pattern or Chain of Responsibility Method is a Behavioral Design Pattern,

which allows an object to send a request to other objects without knowing who is going to handle it.

·       This pattern is frequently used in the chain of multiple objects,

where each object either handles the request or passes it on to the next object in the chain if it is unable to handle that request.

·       This pattern encourages loose coupling between sender and receiver, providing freedom in handling the request.

 

 

 

 

 


// Handler Interface
interface SupportHandler {
   
void handleRequest(Request request);
   
void setNextHandler(SupportHandler nextHandler);
}

// Concrete Handlers
class Level1SupportHandler implements SupportHandler {
   
private SupportHandler nextHandler;

   
public void setNextHandler(SupportHandler nextHandler) {
       
this.nextHandler = nextHandler;
    }

   
public void handleRequest(Request request) {
       
if (request.getPriority() == Priority.BASIC) {
           
System.out.println("Level 1 Support handled the request.");
        }
else if (nextHandler != null) {
           
nextHandler.handleRequest(request);
        }
    }
}

class Level2SupportHandler implements SupportHandler {
   
private SupportHandler nextHandler;

   
public void setNextHandler(SupportHandler nextHandler) {
       
this.nextHandler = nextHandler;
    }

   
public void handleRequest(Request request) {
       
if (request.getPriority() == Priority.INTERMEDIATE) {
           
System.out.println("Level 2 Support handled the request.");
        }
else if (nextHandler != null) {
           
nextHandler.handleRequest(request);
        }
    }
}

class Level3SupportHandler implements SupportHandler {
   
public void handleRequest(Request request) {
       
if (request.getPriority() == Priority.CRITICAL) {
           
System.out.println("Level 3 Support handled the request.");
        }
else {
           
System.out.println("Request cannot be handled.");
        }
    }

   
public void setNextHandler(SupportHandler nextHandler) {
       
// No next handler for Level 3
   
}
}

// Request Class
class Request {
   
private Priority priority;

   
public Request(Priority priority) {
       
this.priority = priority;
    }

   
public Priority getPriority() {
       
return priority;
    }
}

// Priority Enum
enum Priority {
   
BASIC, INTERMEDIATE, CRITICAL
}

// Main Class
public class ChainOfResponsibility {
   
public static void main(String[] args) {
       
SupportHandler level1Handler = new Level1SupportHandler();
       
SupportHandler level2Handler = new Level2SupportHandler();
       
SupportHandler level3Handler = new Level3SupportHandler();

       
level1Handler.setNextHandler(level2Handler);
       
level2Handler.setNextHandler(level3Handler);

       
Request request1 = new Request(Priority.BASIC);
       
Request request2 = new Request(Priority.INTERMEDIATE);
       
Request request3 = new Request(Priority.CRITICAL);

       
level1Handler.handleRequest(request1);
       
level1Handler.handleRequest(request2);
       
level1Handler.handleRequest(request3);
    }
}

 

Level 1 Support handled the request.

Level 2 Support handled the request.

Level 3 Support handled the request.