Избегайте соединения отправителя запроса с его получателем, предоставляя более чем одному объекту возможность обработать запрос. Соедините получающие объекты в цепочку и передавайте запрос по цепочке до тех пор, пока объект не обработает его.
- Обработчик: определяет интерфейс для обработки запросов. (необязательно) реализует ссылку-преемник
- Конкретный обработчик: обрабатывает запросы, за которые он отвечает. Может получить доступ к его преемнику. Если конкретный обработчик может обработать запрос, он делает это; в противном случае он пересылает запрос своему преемнику.
- Клиент: инициирует запрос к объекту 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”