minstudio

책임 연쇄 패턴 (Chain of Responsibility)

책임 연쇄 패턴(Chain of Responsibility Pattern)은 클라이언트의 요청을 처리할 수 있는 여러 객체들을 하나의 사슬(Chain)로 연결해 두고, 자신이 처리할 수 없으면 다음 객체로 요청을 떠넘기는 행위 패턴입니다.

회사에서 결재를 올릴 때, 100만 원짜리 기안은 '팀장'이 바로 승인하지만, 1000만 원짜리 기안은 팀장이 처리할 권한이 없으므로 '본부장'에게 결재를 넘깁니다. 본부장도 안되면 '사장'에게 넘어가는 다단계 처리 구조를 `if-else` 중첩 없이 유연하게 만들 수 있습니다.

⛓️ Chain of Responsibility: 나 아니면 다음 사람에게 토스! 사원 (Client) "500만원 결재좀" 팀장 (Handler) 한도: 100만원 한도 초과! 패스 토스 본부장 (Handler) 한도: 1000만원 결재 승인 완료! 사장 (Handler) 한도: 무제한 (앞에서 처리돼서 쉼)
abstract class Approver {
    protected Approver next;
    
    public void setNext(Approver next) {
        this.next = next;
    }
    
    public abstract void processRequest(int amount);
}

class Manager extends Approver {
    public void processRequest(int amount) {
        if (amount <= 1000) {
            System.out.println("매니저가 " + amount + "원 결재 완료");
        } else if (next != null) {
            next.processRequest(amount);
        }
    }
}

class Director extends Approver {
    public void processRequest(int amount) {
        if (amount <= 5000) {
            System.out.println("디렉터가 " + amount + "원 결재 완료");
        } else if (next != null) {
            next.processRequest(amount);
        }
    }
}

class CEO extends Approver {
    public void processRequest(int amount) {
        System.out.println("CEO가 " + amount + "원 결재 완료");
    }
}

public class Main {
    public static void main(String[] args) {
        Approver manager = new Manager();
        Approver director = new Director();
        Approver ceo = new CEO();
        
        manager.setNext(director);
        director.setNext(ceo);
        
        manager.processRequest(500);   // 매니저
        manager.processRequest(3000);  // 디렉터
        manager.processRequest(10000); // CEO
    }
}
책임 연쇄 패턴 (Chain of Responsibility) | Minstudio