Chain of Responsibility (Цепочка обязанностей)
Шаблон проектирования "Цепочка обязанностей" (Chain of Responsibility) позволяет передавать запросы по цепочке обработчиков. Каждый обработчик может обработать запрос или передать его следующему обработчику в цепочке. Это позволяет избежать жесткой привязки между отправителем и получателем запроса и упрощает добавление новых обработчиков.
Пример использования паттерна Chain of Responsibility на Java
Рассмотрим пример, в котором у нас есть система обработки заявок на поддержку. У нас будут разные уровни поддержки: TechnicalSupport
, Manager
и Director
. Каждый уровень будет обрабатывать запросы, если он может, или передавать их дальше по цепочке.
Шаг 1: Создание абстрактного класса обработчика
public abstract class SupportHandler {
protected SupportHandler nextHandler;
public void setNextHandler(SupportHandler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handleRequest(String request);
}
Шаг 2: Реализация конкретных обработчиков
public class TechnicalSupport extends SupportHandler {
@Override
public void handleRequest(String request) {
if (request.equalsIgnoreCase("Technical Issue")) {
System.out.println("Technical Support: Handling technical issue.");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
public class Manager extends SupportHandler {
@Override
public void handleRequest(String request) {
if (request.equalsIgnoreCase("Manager Issue")) {
System.out.println("Manager: Handling managerial issue.");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
public class Director extends SupportHandler {
@Override
public void handleRequest(String request) {
if (request.equalsIgnoreCase("Director Issue")) {
System.out.println("Director: Handling director issue.");
} else {
System.out.println("Director: No handler for this request.");
}
}
}
Шаг 3: Использование цепочки обязанностей
Теперь мы можем использовать нашу цепочку в коде:
public class ChainOfResponsibilityDemo {
public static void main(String[] args) {
SupportHandler technicalSupport = new TechnicalSupport();
SupportHandler manager = new Manager();
SupportHandler director = new Director();
// Устанавливаем цепочку
technicalSupport.setNextHandler(manager);
manager.setNextHandler(director);
// Обработка запросов
technicalSupport.handleRequest("Technical Issue");
technicalSupport.handleRequest("Manager Issue");
technicalSupport.handleRequest("Director Issue");
technicalSupport.handleRequest("Unknown Issue");
}
}
Объяснение
-
Абстрактный класс
SupportHandler
: Определяет методhandleRequest()
и ссылку на следующий обработчик в цепочке. МетодsetNextHandler()
позволяет установить следующий обработчик. -
Классы
TechnicalSupport
,Manager
иDirector
: Реализуют методhandleRequest()
. Каждый класс проверяет, может ли он обработать запрос. Если нет, он передает запрос следующему обработчику в цепочке. -
Класс
ChainOfResponsibilityDemo
: Демонстрирует использование паттерна "Цепочка обязанностей". Мы создаем цепочку обработчиков и обрабатываем различные запросы.
Заключение
Паттерн "Цепочка обязанностей" позволяет создавать гибкие и расширяемые системы обработки запросов, избегая жесткой привязки между отправителем и получателем. В приведенном примере мы увидели, как можно использовать цепочку для обработки заявок на поддержку, позволяя каждому уровню обрабатывать только те запросы, которые ему под силу.