Skip to content

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");
    }
}

Объяснение

  1. Абстрактный класс SupportHandler: Определяет метод handleRequest() и ссылку на следующий обработчик в цепочке. Метод setNextHandler() позволяет установить следующий обработчик.

  2. Классы TechnicalSupport, Manager и Director: Реализуют метод handleRequest(). Каждый класс проверяет, может ли он обработать запрос. Если нет, он передает запрос следующему обработчику в цепочке.

  3. Класс ChainOfResponsibilityDemo: Демонстрирует использование паттерна "Цепочка обязанностей". Мы создаем цепочку обработчиков и обрабатываем различные запросы.

Заключение

Паттерн "Цепочка обязанностей" позволяет создавать гибкие и расширяемые системы обработки запросов, избегая жесткой привязки между отправителем и получателем. В приведенном примере мы увидели, как можно использовать цепочку для обработки заявок на поддержку, позволяя каждому уровню обрабатывать только те запросы, которые ему под силу.