Hello

[디자인 패턴] - 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) 필터 체인, 이벤트 처리기, 로깅 시스템

 

객체 간 결합도를 줄이고 싶을 때

요청을 처리할 수 있는 객체가 바뀌더라도, 클라이언트 코드 수정을 최소화하고 싶을 때

 

정리하자면

요청을 처리할 수 있는 여러 객체들을 사슬처럼 연결해, 하나의 객체가 처리하거나 다음 객체에게 넘겨 처리하게 하는 디자인 패턴이다.

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기