Як організовується передача запиту по ланцюжку обробників?
Передача запиту в Chain of Responsibility (Ланцюжку обов'язків) організовується через послідовне делегування - кожен обробник отримує запит, вирішує, чи може він його обробити, і або виконує дію, або передає далі наступній ланці.
1. Базовий принцип
Кожен обробник зберігає посилання на наступний (nextHandler) і реалізує метод handle(request):
java
abstract class Handler {
protected Handler next;
public Handler linkWith(Handler next) {
this.next = next;
return next;
}
public abstract boolean handle(String request);
}2. Механізм передачі
- Клієнт надсилає запит першому обробнику в ланцюжку.
- Обробник перевіряє, чи може він його обробити.
- Якщо так, він виконує дію (і може зупинити ланцюжок).
- Якщо ні, він викликає
next.handle(request).
- Запит передається по ланцюжку до тих пір, поки один з обробників не обробить його або ланцюжок не закінчиться.
3. Приклад
java
class AuthHandler extends Handler {
public boolean handle(String request) {
if (request.equals("auth")) {
System.out.println("Перевірка авторизації");
return true; // оброблено, ланцюжок переривається
}
if (next != null) return next.handle(request);
return false;
}
}
class LogHandler extends Handler {
public boolean handle(String request) {
System.out.println("Логування запиту");
if (next != null) return next.handle(request);
return false;
}
}Створення ланцюжка:
java
Handler chain = new LogHandler();
chain.linkWith(new AuthHandler());
chain.handle("auth");4. Ключові особливості
- Гнучкість: можна легко переставляти або додавати ланки.
- Прозорість: відправник не знає, хто саме обробить запит.
- Контроль передачі: ланцюжок може завершитися достроково (при успішній обробці).
Підсумок
Запит у патерні Chain of Responsibility проходить лінійним ланцюжком об'єктів, де кожен обробник сам вирішує, обробляти його чи передати далі. Це створює гнучку, налаштовувану послідовність дій без жорстких зв'язків між компонентами.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.