Что такое шаблон проектирования Chain of Responsibility
1️⃣ Как кратко ответить
Chain of Responsibility — это поведенческий шаблон проектирования, который позволяет передавать запросы по цепочке обработчиков. Каждый обработчик решает, может ли он обработать запрос, или передает его следующему обработчику в цепи.
2️⃣ Подробное объяснение темы
Шаблон проектирования Chain of Responsibility (Цепочка обязанностей) используется для организации обработки запросов несколькими объектами. Этот шаблон позволяет избежать жесткой привязки отправителя запроса к его получателю, предоставляя возможность передавать запросы по цепочке потенциальных обработчиков, пока один из них не обработает запрос.
Зачем это нужно
Chain of Responsibility полезен, когда необходимо обработать запрос, но заранее неизвестно, какой объект должен это сделать. Это позволяет динамически определять обработчик и упрощает добавление новых обработчиков без изменения существующего кода.
Как это работает
- Обработчики: Каждый объект в цепочке является обработчиком, который имеет ссылку на следующий объект в цепи.
- Запрос: Запрос передается первому обработчику. Если он не может его обработать, он передает запрос следующему обработчику в цепи.
- Передача: Процесс продолжается до тех пор, пока запрос не будет обработан или не достигнет конца цепи.
Пример кода
Рассмотрим пример, где у нас есть система обработки жалоб, и каждая жалоба может быть обработана разными уровнями поддержки: оператором, менеджером и директором.
// Абстрактный класс для всех обработчиков
abstract class SupportHandler {
protected SupportHandler nextHandler;
// Метод для установки следующего обработчика в цепи
public void setNextHandler(SupportHandler nextHandler) {
this.nextHandler = nextHandler;
}
// Абстрактный метод для обработки запроса
public abstract void handleRequest(String request);
}
// Конкретный обработчик: Оператор
class Operator extends SupportHandler {
@Override
public void handleRequest(String request) {
if (request.equals("simple")) {
System.out.println("Operator: Handling simple request.");
} else if (nextHandler != null) {
// Передача запроса следующему обработчику
nextHandler.handleRequest(request);
}
}
}
// Конкретный обработчик: Менеджер
class Manager extends SupportHandler {
@Override
public void handleRequest(String request) {
if (request.equals("intermediate")) {
System.out.println("Manager: Handling intermediate request.");
} else if (nextHandler != null) {
// Передача запроса следующему обработчику
nextHandler.handleRequest(request);
}
}
}
// Конкретный обработчик: Директор
class Director extends SupportHandler {
@Override
public void handleRequest(String request) {
if (request.equals("complex")) {
System.out.println("Director: Handling complex request.");
} else if (nextHandler != null) {
// Передача запроса следующему обработчику
nextHandler.handleRequest(request);
}
}
}
// Пример использования
public class Main {
public static void main(String[] args) {
// Создание обработчиков
SupportHandler operator = new Operator();
SupportHandler manager = new Manager();
SupportHandler director = new Director();
// Установка цепочки обязанностей
operator.setNextHandler(manager);
manager.setNextHandler(director);
// Обработка различных запросов
operator.handleRequest("simple"); // Обрабатывается оператором
operator.handleRequest("intermediate"); // Обрабатывается менеджером
operator.handleRequest("complex"); // Обрабатывается директором
}
}
Объяснение кода
- SupportHandler: Абстрактный класс, представляющий обработчик. Он содержит ссылку на следующий обработчик и абстрактный метод
handleRequest, который должен быть реализован в подклассах. - Operator, Manager, Director: Конкретные обработчики, которые реализуют метод
handleRequest. Каждый из них проверяет, может ли он обработать запрос, и если нет, передает его следующему обработчику. - setNextHandler: Метод для установки следующего обработчика в цепи.
- Main: В этом классе создается цепочка обработчиков, и запросы передаются первому обработчику в цепи. Каждый обработчик либо обрабатывает запрос, либо передает его дальше.
Chain of Responsibility позволяет легко добавлять новые уровни обработки, просто создавая новый класс обработчика и добавляя его в цепочку. Это делает систему гибкой и расширяемой.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться