[디자인 패턴] - Chain of Responsibility
by 볼빵빵오춘기Chain of Responsibility
여러 개의 처리 객체(Handler)를 체인으로 연결해, 요청을 처리할 수 있는 객체가 책임을 맡아 처리하고, 처리할 수 없으면 다음 객체에 요청을 넘기는 구조의 패턴이다.
즉, 요청을 보냈을 때 누가 처리할지는 런타임에 결정되고, 유연하게 책임 분산이 가능하다.
예시 코드
// Handler 인터페이스
abstract class Handler {
protected Handler next;
public Handler setNext(Handler next) {
this.next = next;
return next;
}
public abstract void handle(String request);
}
// Concrete Handler A
class Manager extends Handler {
public void handle(String request) {
if (request.equals("leave")) {
System.out.println("Manager: 처리함 (연차 신청)");
} else if (next != null) {
next.handle(request);
}
}
}
// Concrete Handler B
class Director extends Handler {
public void handle(String request) {
if (request.equals("budget")) {
System.out.println("Director: 처리함 (예산 요청)");
} else if (next != null) {
next.handle(request);
}
}
}
// Concrete Handler C
class CEO extends Handler {
public void handle(String request) {
System.out.println("CEO: 최종 처리 또는 거절");
}
}
// Client
public class ChainOfResponsibilityExample {
public static void main(String[] args) {
Handler manager = new Manager();
Handler director = new Director();
Handler ceo = new CEO();
// 체인 연결
manager.setNext(director).setNext(ceo);
manager.handle("leave"); // Manager 처리
manager.handle("budget"); // Director 처리
manager.handle("hire"); // 아무도 못 처리 -> CEO 처리
}
}
Chain of Responsibility 패턴의 장점
결합도 낮춤
요청을 보내는 쪽과 처리하는 쪽이 직접 연결되지 않아, 객체 간 결합도가 낮아진다.
유연한 처리 흐름
요청 처리 순서를 쉽게 변경 가능하고, 새로운 핸들러 추가도 쉽다.
단일 책임 원칙 (SRP) 준수
각 객체가 자신이 처리할 수 있는 일만 처리한다.
실행 중 요청 처리자 결정
어떤 객체가 처리할지 코드를 수정하지 않고도 동적으로 설정 가능하다.
Chain of Responsibility 패턴의 단점
요청이 처리되지 않을 수도 있음
체인 끝까지 요청이 전달되었지만 아무도 처리하지 않으면 문제가 발생할 수 있다.
디버깅 어려움
요청이 어디에서 처리됐는지 추적하기 어렵다.
복잡도 증가
체인 구성과 유지관리가 복잡해질 수 있다.
Chain of Responsibility 패턴은 언제 사용하나?
여러 객체가 요청을 처리할 수 있는 경우
각 객체가 자신의 책임 범위 내에서만 요청을 처리하게 하고 싶을 때
요청 처리 순서를 동적으로 바꾸고 싶을 때
ex) 필터 체인, 이벤트 처리기, 로깅 시스템
객체 간 결합도를 줄이고 싶을 때
요청을 처리할 수 있는 객체가 바뀌더라도, 클라이언트 코드 수정을 최소화하고 싶을 때
정리하자면
요청을 처리할 수 있는 여러 객체들을 사슬처럼 연결해, 하나의 객체가 처리하거나 다음 객체에게 넘겨 처리하게 하는 디자인 패턴이다.
'👩🏻💻 About 프로그래밍 > Spring, Spring boot' 카테고리의 다른 글
[디자인 패턴] - Interpreter (1) | 2025.04.09 |
---|---|
[디자인 패턴] - Command (0) | 2025.04.09 |
[디자인 패턴] - Proxy (0) | 2025.04.09 |
[디자인 패턴] - Flyweight (0) | 2025.04.09 |
[디자인 패턴] - Facade (0) | 2025.04.09 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기