Рубрики
Без рубрики

Схема цепочки ответственности

Избегайте связывания отправителя запроса с его получателем, предоставляя возможность зависать нескольким объектам… Помеченный шаблонами проектирования, java, шаблоном, поведенческим.

Избегайте соединения отправителя запроса с его получателем, предоставляя более чем одному объекту возможность обработать запрос. Соедините получающие объекты в цепочку и передавайте запрос по цепочке до тех пор, пока объект не обработает его.

  • Обработчик: определяет интерфейс для обработки запросов. (необязательно) реализует ссылку-преемник
  • Конкретный обработчик: обрабатывает запросы, за которые он отвечает. Может получить доступ к его преемнику. Если конкретный обработчик может обработать запрос, он делает это; в противном случае он пересылает запрос своему преемнику.
  • Клиент: инициирует запрос к объекту ConcreteHandler в цепочке.
public class Main {

    public static void main(String[] args) {
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        Handler h3 = new ConcreteHandler3();
        h1.setSuccessor(h2);
        h2.setSuccessor(h3);
        int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

        for (int request : requests) {
            h1.handleRequest(request);
        }

    }
}

public abstract class Handler {

    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    abstract void handleRequest(int request);
}

public class ConcreteHandler1 extends Handler {

    @Override
    public void handleRequest(int request) {
        if (request >= 0 && request < 10) {
            System.out.println(this.getClass().getSimpleName() + " handled request " + request);
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

public class ConcreteHandler2 extends Handler {

    @Override
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println(this.getClass().getSimpleName() + " handled request " + request);
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

public class ConcreteHandler3 extends Handler {

    @Override
    public void handleRequest(int request) {
        if (request >= 20 && request < 30) {
            System.out.println(this.getClass().getSimpleName() + " handled request " + request);
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}
ConcreteHandler1 handled request 2
ConcreteHandler1 handled request 5
ConcreteHandler2 handled request 14
ConcreteHandler3 handled request 22
ConcreteHandler2 handled request 18
ConcreteHandler1 handled request 3
ConcreteHandler3 handled request 27
ConcreteHandler3 handled request 20

eidherjulian61/дизайн-шаблоны

Основные шаблоны Проектирования

eidher ・ 27 сентября ・ 1 минута чтения

Оригинал: “https://dev.to/eidher/chain-of-responsibility-pattern-3o73”